我正在尝试使用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文件中显示时加载,并且自动增量不会干扰。
答案 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工作已经为你完成了。