belongs_to关系在我保存之前不起作用 - 我做错了吗?

时间:2011-12-06 22:26:11

标签: ruby-on-rails ruby

可能这只是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关系暂时被打破,直到我实际保存到数据库。

有人想让我放松心情和/或告诉我“正确”的做法吗?

2 个答案:

答案 0 :(得分:1)

这是正确的;直到Foo中有一个ID,Bar没有用于获取Foo的内容。

答案 1 :(得分:1)

你刚才用这句话回答了你自己的问题:

  

我猜是有意义的;我的意思是,它不能将id字段设置为指向它的Foo,直到Foo实际上有一个id,并且在我保存之前不会发生

由于belongs_to使用Bar上的外键来匹配Foo上的id,因此在该ID存在之前就不能建立关系。

作为旁注,你可以做到

f.bars.new 

自动设置关系,而无需f.bars << b