可能这只是Rails的工作方式,但我想仔细检查,因为我是新手,我不确定我是否遗漏了什么。
我正在创建一个相当复杂的模型集,它具有许多嵌套的has_many / belongs_to关系。最初,我尝试使用create()方法,但由于每次都会启动一个数据库连接,因此最终需要花费的时间比它应该的时间长得多。所以我使用new()来创建所有对象,使用<<将嵌套模型添加到更高的模型,然后在最后我在顶级模型上执行save()。
这一切都有效,但我发现在执行保存之前,belongs_to关系不起作用。换句话说:
class Foo < ActiveRecord::Base
has_many :bars
end
class Bar < ActiveRecord::Base
belongs_to :foo
end
f = Foo.new
b = Bar.new
f.bars << b
puts "It's nil!" if b.foo == nil #yup, it's nil
f.save
puts "It's good!" if b.foo != nil #yup, it's good
我猜是有意义的;我的意思是,它不能将id字段设置为指向它的Foo,直到Foo实际上具有一个id,并且直到我保存才会发生。这不是什么大问题,我只注意到它,因为我最初编写(相当复杂)初始化的方式,其中一个较低级别的模型正在调用从祖父母那里获取一些信息,而这是行不通的。代码的清洁现在无论如何都把它拿出去了,但是我无法帮助这种唠叨的感觉,我完全以错误的方式做这件事,并且永远不会出现这样的情况:has_many关系暂时被打破,直到我实际保存到数据库。
有人想让我放松心情和/或告诉我“正确”的做法吗?
答案 0 :(得分:1)
这是正确的;直到Foo
中有一个ID,Bar
没有用于获取Foo
的内容。
答案 1 :(得分:1)
你刚才用这句话回答了你自己的问题:
我猜是有意义的;我的意思是,它不能将id字段设置为指向它的Foo,直到Foo实际上有一个id,并且在我保存之前不会发生
由于belongs_to
使用Bar上的外键来匹配Foo上的id,因此在该ID存在之前就不能建立关系。
作为旁注,你可以做到
f.bars.new
自动设置关系,而无需f.bars << b