2009-02-19 112 views
77

我正在努力讓HATBM正常工作。我有一個毆打scanario:文章和標籤。我認爲,應該在這裏使用HABTM,因爲它是一種多對多的關係。 但是我不知道是否應該手動創建連接表(在這種情況下是articles_tags)。我是否需要手動爲HABTM連接表創建遷移?

我目前的代碼如下:

class Article < ActiveRecord::Base 
    has_and_belongs_to_many :tags 
end 

class Tag < ActiveRecord::Base 
    has_and_belongs_to_many :articles 
end 

當我運行遷移,則不會創建第三個表。 另外,我想補充一點,我的第三張表不承擔任何域邏輯,只是盲目分配。

我用Rails 2.2.2

+1

即使在第四軌,我猜這個答案是......「是」? ( – dtc 2013-12-09 21:48:29

+1

@dtc,仍然是,仍然如此。 – Valentin 2013-12-10 06:34:23

回答

140

你應該在一個表的遷移做到這一點,或者在單獨的遷移,如果這些移民已經跑:

create_table :articles_tags, :id => false do |t| 
    t.references :article, :tag 
end 

add_index :articles_tags, [:article_id, :tag_id] 

這將爲你創建表格並且:id => false告訴Rails不要向這個表格添加一個id字段。還有一個索引,它將加快查找這個連接表。

你也可以生成此模型(ArticlesTag),並做到:

# article.rb 
has_many :articles_tags 
has_many :tags, :through => :articles_tags 

# tag.rb 
has_many :articles_tags 
has_many :articles, :through => :articles_tags 

# article_tag.rb 
belongs_to :tag 
belongs_to :article 

然後從script/generate model articles_tag調用生成的遷移創建表。

+0

感謝雷達,這就是我所需要的! – Valentin 2009-02-19 07:51:56

+12

有趣的是,官方指南或文檔沒有說明這一點,我不得不挖掘Stackoverflow。 – lzap 2011-03-07 08:14:41

7

您可能還需要添加索引的遷移:

add_index 「articles_tags」 裏, 「article_id」

add_index 「articles_tags」, 「TAG_ID」

但是,如果你想標記功能我建議acts_as_taggable_on Rails插件:

http://www.intridea.com/tag/acts_as_taggable_on http://github.com/mbleigh/acts-as-taggable-on/

我已經在一個項目中使用過它,它很容易實現。

標記連接表的問題之一是它可以很容易地爲您希望製作標記的每種內容類型(即comments_tags,posts_tags,images_tags等)創建連接表。這個插件使用一個標記表,其中包括一個鑑別器來確定內容類型,而不需要每種類型的特定連接表。

相關問題