Rails的富= VS foo_id =

问题描述:

如果酒吧belongs_to的foo和FOO的has_many酒吧,有的Rails的富= VS foo_id =

my_bar.foo = my_foo 

my_bar.foo_id = my_foo.id 

或执行这两种效应之间的差异使my_foo和之间的关联my_bar?

我问,因为我试图决定是否手动添加关联,当我重写bar#foo_id =(input)的setter。

你的问题包含有点不准,在没有这些创建关联:他们设置了关联起来(“建”吧,如果你喜欢),但它不会被创建,即保存进入数据库,直到my_bar保存

这两个应该设置代理对方:如果你说my_bar.foo_id = 4,然后my_bar.foo应该id为4返回FOO,甚至之前,它的保存,反之亦然。

如果你打算覆盖Bar#foo_id的setter(按照惯例,当描述方法时,hash表示一个实例方法而不是类方法),如果你不复制自然行为,你可能会陷入麻烦的Rails。仔细踩踏。

+0

我用“创造”过于松散,而不是正式的意义。我会更新我的问题。感谢您的答复。这正是我需要知道的。 – Qaz

主要区别在于bar_id不能被填充,直到条记录被保存(当id属性被分配时)。您可以在内存中创建一个Bar对象,并在保存任一记录之前将其与一个条(foo =部分)相关联。通常,当你保存酒吧时,foo也会被验证和保存。

  • foo_id是将被保存到数据库的属性,它将引用FOOS表中的记录。
  • foo是一个实例化的ActiveRecord对象,它作为属性存储在条对象中。

通常,如果您将新的Bar与现有的foo关联,则会设置foo_id。如果你同时创建它们,我会设置foo。

编辑:看到你的问题的最后一部分。如果您重写setter来添加功能,我将首先调用super(value)以获取ActiveRecord中的所有现有功能。例如。

def foo_id=(value) 
    super(value) 
    @foo_id = value 
    do_other_thing 
end 

我建议用删除此功能的方式重写此方法。