关于activerecord:激活Active Record-一次保存多个对象

 2021-04-09 

Rails Active Record - Save multiple objects at once

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

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

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

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


每次插入数据库的调用将分别完成(在不同事务中)。但是您可以减少将所有创建物package在一个事务中的总延迟。

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

在这种情况下,所有创建的内容都将package在一个原子数据库事务中。

看看transaction文档。

也可以尝试accepts_nested_attributes_for

Nested attributes allow you to save attributes on associated records through the parent.

希望有帮助。