2015-08-18 18 views
3

如果酒吧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。

回答

1

你的問題包含有點不準,在沒有這些創建關聯:他們設置了關聯起來(「建」吧,如果你喜歡),但它不會被創建,即保存進入數據庫,直到my_bar保存

這兩個應該設置代理對方:如果你說my_bar.foo_id = 4,然後my_bar.foo應該id爲4返回FOO,甚至之前,它的保存,反之亦然。

如果你打算覆蓋Bar#foo_id的setter(按照慣例,當描述方法時,hash表示一個實例方法而不是類方法),如果你不復制自然行爲,你可能會陷入麻煩的Rails。仔細踩踏。

+0

我用「創造」過於鬆散,而不是正式的意義。我會更新我的問題。感謝您的答覆。這正是我需要知道的。 – Qaz

1

主要區別在於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 

我建議用刪除此功能的方式重寫此方法。