在FasterCSV加载期间抑制自动增量

时间:2011-08-30 15:07:09

标签: ruby-on-rails csv load auto-increment has-many

我正在尝试使用FasterCSV导出和导入两个相关模型。第一个模型是Task,第二个模型是PrecedingTask。任务有许多先行任务。

正如您所料,PrecedingTask使用task_id字段引用Task。

但是,FasterCSV无法从.csv文件数据加载task.id字段。相反,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

__ _ __ _ __ 更新 __ _ __ _ ___

卫生署!

原来我的Rake代码很好,我不需要对自动增量做任何特别的事情。

问题是我没有在attr_accessible列表中包含Task.id,所以它被忽略了。通过该更改,id会在task.csv文件中显示时加载,并且自动增量不会干扰。

1 个答案:

答案 0 :(得分:1)

我认为你想要的是:

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

将在create上创建Task的id,然后您要做的就是创建属于任务的preceding_task。 precedingTask的task_id和id工作已经为你完成了。