belongs_to :keeper, :class_name => "Staff"
belongs_to "staff", :foreign_key => "keeper_id"
在我的基本測試中,這些似乎是做了完全相同的事情。
它們確實是一樣的嗎?
一個比另一個更好嗎?這兩個'belongs_to'語句之間有任何區別
belongs_to :keeper, :class_name => "Staff"
belongs_to "staff", :foreign_key => "keeper_id"
在我的基本測試中,這些似乎是做了完全相同的事情。
它們確實是一樣的嗎?
一個比另一個更好嗎?這兩個'belongs_to'語句之間有任何區別
這兩個語句定義了相同的關聯。區別在於定義的關聯是如何由定義這些關聯的類引用的。
調用belongs_to爲調用類定義了全新的實例方法來處理給定的關係。這些新方法是根據belongs_to的第一個參數命名的。與大多數Rails其餘部分一樣,ActiveRecord將使用從第一個參數派生的合理默認值來生成管理關聯的方法。爲belongs_to提供附加參數,僅覆蓋這些默認值。
實際上,它們的名字完全相同。這一切都歸結於您的個人偏好。您是否願意提及@model.keeper
或@model.staff
的關聯?
請仔細閱讀belongs_to section of the Associations參考,以更好地瞭解模型屬於另一個模型時所提供的方法以及如何使用belongs_to的選項。
沒有這些語句在他們要給你使用它們的類的方法上稍有不同。讓我們假設你定義的類辦公室內這些語句,因此第一條語句,即
class Office < ActiveRecord::Base
belongs_to :keeper, :class_name => "Staff"
end
創造員工和Office類,但由辦公室工作人員的關係之間的關係被稱爲門將,將使用keeper_id作爲在Office類的外鍵建立關係。所以,如果你在辦公室可變Office對象的實例,那麼你就可以得到工作人員使用
office.keeper
在其他場景,辦公對象,
class Office < ActiveRecord::Base
belongs_to :staff, :foreign_key => "keeper_id"
end
要創建員工之間的關係Office類以及Office與Staff之間的關係稱爲staff,並且將在Office類中使用keeper_id作爲外鍵,以便按照您指定的外鍵來建立關係。
所以,如果你想獲得對工作人員這種情況下,那麼你會做
office.staff
總之,如果你只是做
belongs_to :staff
在你的模型,然後根據Rails約定,你將在你的模型中得到一個員工方法,它將使用staff_id作爲外鍵來建立員工模型和這個模型之間的關係。但是,在特殊情況下,Rails還可以選擇覆蓋這些約定,例如傳統應用程序。所以基本上你使用外鍵和類名覆蓋上面兩個語句中的rails約定。
這兩個代碼做類似的事情,但有區別。在第一行的情況下,導軌猜測Staff
的引用是由keeper_id
完成的,它只是增加了一個_id
。在第二種情況下,您通過給出:foreign_key
屬性來告訴它應該在哪裏搜索參考。
區別可能在於你如何引用你想要屬於的類。在第一種情況下,它將是XY.keeper
,在第二種情況下它應該是XY.staff
。取決於你喜歡哪種形式。
雖然這兩種方法在定義關係方面是等價的,但主要區別在於名稱,兩者中的「更好」是您當前使用最多的。這是一個比任何事情都重要的問題。
你想指事情:
object.keeper
抑或是更明智的使用:
object.staff
我個人的偏好是第一種形式,但一般要清楚我如果在任何方面都不尋常,就表達所有關係的怪癖。其定義如下:
belongs_to :keeper,
:class_name => 'Staff',
:foreign_key => :keeper_id
通過詳細說明關係的性質,可能出現的混淆程度被最小化。
看起來每個人都同意這裏;)謝謝。 – 99miles 2010-02-09 22:44:34