2012-11-29 54 views
1

我看看這兩個博客文章,感覺有點晦澀難懂有關回報率的has_many關係一對多的關係:很多在Rails的

在這其中:http://kconrails.com/2010/01/16/many-to-many-relationships-in-ruby-on-rails/,在「的has_many:通過」一節中,筆者認爲用於連接表貢獻就像是遷移文件:

class CreateContributions < ActiveRecord::Migration 
    def self.up 
    create_table :contributions do |t| 
     t.references :artist 
     t.references :song 
     t.string :instrument 
     t.timestamps 
    end 
........... 

因此連接表的遷移將參考2臺藝術家使用t.referen ces:藝術家t.references:歌曲。如果我們想要訪問該歌曲的樂器演奏者演奏等屬性,我們可以使用連接表貢獻訪問它。

在第二個職位:http://kconrails.com/2010/01/29/has_and_belongs_to_many-associations-in-ruby-on-rails/。欄目:「has_many:through」,作者介紹了名爲分類的「成熟桌子」。遷移是象下面這樣:

class CreateCategorizations < ActiveRecord::Migration 
    def self.up 
    create_table :categorizations do |t| 
     t.integer :category_id 
     t.integer :item_id 
     t.timestamps 
    end 
........... 

所以羽翼豐滿表的遷移將t.integer參考表2和類項目:CATEGORY_IDt.integer:ITEM_ID。我們只能訪問與表格的兩個屬性(如時間戳)相關的特定屬性,我們是否可以向模型添加更多屬性(如t.string:instrument)?

例如,如果我有很多一對多的關係模型,如廠商產品,我要跟蹤價格的,我應該把它變成全面的表,對不對?但是,如果我只想添加一個屬性,但不會像Original_From(顯示產品的生產位置)那樣跟蹤它,我只需要將其放入連接表中?

我可以概括這樣說:當屬性的數量是有限的,不重要的跟蹤,可使用連接表。當屬性的數量很多並且我們想要跟蹤時,我們將使用完整的表格。這是對的嗎?

當我們訪問的數據有什麼區別?就像我想在上面的例子中訪問價格或位置一樣?

我仍然不清楚全面的表和聯接表之間的不同。請給我一些想法。非常感謝你!

+0

更好的支持,他們在技術上是相同的。在某些情況下,您希望使用一個屬性來標記連接表中的每條記錄,該屬性指示該FK組合是否處於活動狀態,或者這兩個組合使用的是樂器。 –

回答

0

我認爲你有這個大多是正確的。 has_and_belongs_to_many(HABTM)在多對多關係的兩個模型上假設(無ID,無時間戳,只是每個表的主鍵的外鍵)之間的簡單連接表。

如果關係本身連接表)是「有用」 - 你想在你的類引用,特別是因爲它有它自己的領域的東西,你把它定義爲自己的模型,並用has_many :through =>來定義雙方的關係,與belongs_to在新模型中。這是「全面的」選項。

大多數情況下,您將通過任一選項獲得相同的方法(例如,您將在Price上獲得locations方法,在Location上獲得prices方法)。但肯定HABTM的選擇更加有限。

例如,我最近發現accepts_nested_attributes_for方法不適用於簡單的HABTM,但可以與has_many :through一起使用。

我覺得這個Rails guide does a really good job of describing when to use one versus the other

(它看起來像未來的Rails 4.0有HABTM和一些新的功能與一個一對多和多對多一對多關係處理:-)

+0

是的,我瞭解HABTM和has_many之間的不同,我唯一關心的是關於連接表和完整表。但D3mon-1stVFW表示它在技術上是一樣的。 – Imhotep

+0

那麼如何從其他表中訪問數據呢?如果我有表產品(名稱),製造商(名稱),製造(product_id,manufacturer_id,價格),我怎樣才能通過加入/成熟的表獲得產品的名稱? 我只能通過product.manufacturing.manufacturer_id或manufacturer.manufacturing.product_id獲取product_id或manufacturer_id。我不知道如何從這些關係中顛倒製造商或產品的名稱。 – Imhotep

+0

這些表在技術上可以是相同的,但Rails理解關係的方式是微妙不同的。 –