gpt4 book ai didi

ruby-on-rails - 在 Rails 中的一次调用中保存多个对象

转载 作者:行者123 更新时间:2023-12-03 05:14:09 26 4
gpt4 key购买 nike

我在 Rails 中有一个方法正在做这样的事情:

a = Foo.new("bar")
a.save

b = Foo.new("baz")
b.save

...
x = Foo.new("123", :parent_id => a.id)
x.save

...
z = Foo.new("zxy", :parent_id => b.id)
z.save

问题是我添加的实体越多,花费的时间就越长。我怀疑这是因为它必须为每条记录访问数据库。由于它们是嵌套的,我知道在 parent 被拯救之前我无法拯救 child ,但我想立即拯救所有 parent ,然后是所有 child 。最好做这样的事情:

a = Foo.new("bar")
b = Foo.new("baz")
...
saveall(a,b,...)

x = Foo.new("123", :parent_id => a.id)
...
z = Foo.new("zxy", :parent_id => b.id)
saveall(x,...,z)

只需两次数据库点击即可完成这一切。有没有一种简单的方法可以在 Rails 中做到这一点,还是我只能一次做一个?

最佳答案

由于需要执行多次插入,数据库将被多次命中。您的情况的延迟是因为每次保存都是在不同的数据库事务中完成的。您可以通过将所有操作包含在一个事务中来减少延迟。

class Foo
belongs_to :parent, :class_name => "Foo"
has_many :children, :class_name => "Foo", :foreign_key=> "parent_id"
end

您的保存方法可能如下所示:

# build the parent and the children
a = Foo.new(:name => "bar")
a.children.build(:name => "123")

b = Foo.new("baz")
b.children.build(:name => "zxy")

#save parents and their children in one transaction
Foo.transaction do
a.save!
b.save!
end

对父对象的 save 调用会保存子对象。

关于ruby-on-rails - 在 Rails 中的一次调用中保存多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2509320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com