Rails Active Record-一次保存多个对象

时间:2018-07-04 14:44:10

标签: ruby-on-rails activerecord

我看了一个问题,但没有找到对我有用的答案。

例如,我有一个具有许多任务的Project模型。我想根据一系列属性为某个项目创建许多任务。因此,在我的项目模型中,我将有一个这样的方法(简化的示例):

def create_tasks(tasks)
   tasks.map{|t| Task.create(project: self, name: t.name)}
end

问题是,对于每个任务,它都会对我的数据库造成打击,并且对于大量记录而言,这是不希望的。我该怎么做,以便ActiveRecord仅对我的数据库进行一次调用? 预先感谢!

1 个答案:

答案 0 :(得分:2)

每次插入数据库的调用将分别进行(在不同事务中)。但是您可以减少在一次交易中包装所有作品的总延迟。

Task.transaction do
    tasks.each{ |task| Task.create(...) }
end

在这种情况下,您所有的创作都将被包装在一个原子数据库事务中。

看看transaction文档。

您也可以尝试accepts_nested_attributes_for

  

嵌套属性允许您通过父级将属性保存在关联记录上。

希望有帮助。