2010-02-09 61 views

回答

5

這兩個語句定義了相同的關聯。區別在於定義的關聯是如何由定義這些關聯的類引用的。

調用belongs_to爲調用類定義了全新的實例方法來處理給定的關係。這些新方法是根據belongs_to的第一個參數命名的。與大多數Rails其餘部分一樣,ActiveRecord將使用從第一個參數派生的合理默認值來生成管理關聯的方法。爲belongs_to提供附加參數,僅覆蓋這些默認值。

實際上,它們的名字完全相同。這一切都歸結於您的個人偏好。您是否願意提及@model.keeper@model.staff的關聯?

請仔細閱讀belongs_to section of the Associations參考,以更好地瞭解模型屬於另一個模型時所提供的方法以及如何使用belongs_to的選項。

+0

看起來每個人都同意這裏;)謝謝。 – 99miles 2010-02-09 22:44:34

1

沒有這些語句在他們要給你使用它們的類的方法上稍有不同。讓我們假設你定義的類辦公室內這些語句,因此第一條語句,即

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約定。

1

這兩個代碼做類似的事情,但有區別。在第一行的情況下,導軌猜測Staff的引用是由keeper_id完成的,它只是增加了一個_id。在第二種情況下,您通過給出:foreign_key屬性來告訴它應該在哪裏搜索參考。

區別可能在於你如何引用你想要屬於的類。在第一種情況下,它將是XY.keeper,在第二種情況下它應該是XY.staff。取決於你喜歡哪種形式。

1

雖然這兩種方法在定義關係方面是等價的,但主要區別在於名稱,兩者中的「更好」是您當前使用最多的。這是一個比任何事情都重要的問題。

你想指事情:

object.keeper 

抑或是更明智的使用:

object.staff 

我個人的偏好是第一種形式,但一般要清楚我如果在任何方面都不尋常,就表達所有關係的怪癖。其定義如下:

belongs_to :keeper, 
    :class_name => 'Staff', 
    :foreign_key => :keeper_id 

通過詳細說明關係的性質,可能出現的混淆程度被最小化。