Подавить автоинкремент во время загрузки FasterCSV - PullRequest
0 голосов
/ 30 августа 2011

Я пытаюсь экспортировать и импортировать две связанные модели, используя FasterCSV. Первая модель - это Задача, а вторая - PrecedingTask. Задача имеет много предыдущих задач.

Как и следовало ожидать, PrecedingTask ссылается на Task с помощью поля task_id.

Однако FasterCSV не может загрузить поле task.id из данных файла .csv. Вместо этого файл task.id заполняется с использованием автоинкремента (как обычно при запуске приложения rails).

Это нарушает связь между Task и PrecedingTask.

Есть ли способ подавления автоинкремента при использовании FasterCSV? Если нет, то каков предлагаемый обходной путь?

Вот соответствующее задание Rake:

def load_tasks
    csv.foreach("db/preceding_tasks.csv") do |row|
        PrecedingTask.create(
        :id                   => row[0],                
        :task_id              => row[1],        
        :predecessor_id       => row[2],
        :created_at           => row[3],      
        :updated_at           => row[4]  
        )
    end

    csv.foreach("db/tasks.csv") do |row|
        Task.create(
        :id                   => row[0],                
        :task_sequence        => row[1],        
        :name                 => row[2],
        :default_duration     => row[3],          
        :alert_code           => row[4],      
        :created_at           => row[5],      
        :updated_at           => row[6],    
        :optional             => row[7],    
        :start_trigger        => row[8],        
        :end_trigger          => row[9]     
        )
    end
end

__ _ __ _ __ ОБНОВЛЕНИЕ __ _ __ _ ___

Doh!

Оказывается, мой код Rake был в порядке, и мне не нужно делать ничего особенного с автоматическим приращением.

Проблема заключалась в том, что я не включил Task.id в список attr_accessible, поэтому он игнорировался. После этого изменения идентификаторы загружаются в том виде, в каком они появляются в файле task.csv, и автоматическое увеличение не мешает работе.

1 Ответ

1 голос
/ 30 августа 2011

Я думаю, что вы хотите, это:

def load_tasks
    csv.foreach("db/tasks.csv") do |row|
        Task.create(
        :id                   => row[0],
        :task_sequence        => row[1],        
        :name                 => row[2],
        :default_duration     => row[3],          
        :alert_code           => row[4],      
        :created_at           => row[5],      
        :updated_at           => row[6],    
        :optional             => row[7],    
        :start_trigger        => row[8],        
        :end_trigger          => row[9]     
        )
    end

    csv.foreach("db/preceding_tasks.csv") do |row|
        t = Task.find(row[1])
        t.preceding_tasks.create(:predecessor_id => row[2], :created_at => row[3], :updated_at => row[4])
    end
end

Идентификатор задачи будет создан при создании, затем все, что вам нужно сделать, это создать предыдущую задачу, которая принадлежит задаче. Task_id и id для PrecedingTask уже позаботятся о вас.

...