我看了一个问题,但没有找到对我有用的答案。
例如,我有一个具有许多任务的Project模型。我想根据一系列属性为某个项目创建许多任务。因此,在我的项目模型中,我将有一个这样的方法(简化的示例):
def create_tasks(tasks)
tasks.map{|t| Task.create(project: self, name: t.name)}
end
问题是,对于每个任务,它都会对我的数据库造成打击,并且对于大量记录而言,这是不希望的。我该怎么做,以便ActiveRecord仅对我的数据库进行一次调用? 预先感谢!
答案 0 :(得分:2)
每次插入数据库的调用将分别进行(在不同事务中)。但是您可以减少在一次交易中包装所有作品的总延迟。
Task.transaction do
tasks.each{ |task| Task.create(...) }
end
在这种情况下,您所有的创作都将被包装在一个原子数据库事务中。
看看transaction
文档。
您也可以尝试accepts_nested_attributes_for
。
嵌套属性允许您通过父级将属性保存在关联记录上。
希望有帮助。