如果酒吧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。
如果酒吧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。仔細踩踏。
主要區別在於bar_id不能被填充,直到條記錄被保存(當id屬性被分配時)。您可以在內存中創建一個Bar對象,並在保存任一記錄之前將其與一個條(foo =
部分)相關聯。通常,當你保存酒吧時,foo也會被驗證和保存。
通常,如果您將新的Bar與現有的foo關聯,則會設置foo_id。如果你同時創建它們,我會設置foo。
編輯:看到你的問題的最後一部分。如果您重寫setter來添加功能,我將首先調用super(value)
以獲取ActiveRecord中的所有現有功能。例如。
def foo_id=(value)
super(value)
@foo_id = value
do_other_thing
end
我建議用刪除此功能的方式重寫此方法。
我用「創造」過於鬆散,而不是正式的意義。我會更新我的問題。感謝您的答覆。這正是我需要知道的。 – Qaz