2009-12-15 47 views
4

我創建了3種型號協會:Rails的ActiveRecord的關係 - 有許多屬於

  • 文章:有一篇文章
  • 標籤:包含標籤
  • ArticleTag:意味着一個多到關聯文章關係中的一個標籤。它包含一個tag_id和一個article_id。

我遇到的問題是我對活動記錄技術相當陌生,我不明白定義一切的正確方法。目前,我認爲這是錯誤的,是我有一個

ArticleTag 
belongs_to :article 
belongs_to :tag 

現在,從這裏開始我的想法是,再加入

Article 
    :has_many :tag 

我不確定是不是我處理這個正確的。謝謝您的幫助!

回答

10

這取決於你是否想要一個連接模型或不。連接模型允許您針對兩個其他模型之間的關聯持有額外的信息。例如,也許你想記錄文章標記時間的時間戳。該信息將根據加入模型進行記錄。

如果你不想加入的模式,那麼你可以使用一個簡單的has_and_belongs_to_many協會:

class Article < ActiveRecord::Base 
    has_and_belongs_to_many :tags 
end 

class Tag < ActiveRecord::Base 
    has_and_belongs_to_many :articles 
end 

隨着Tagging連接模型(這是比ArticleTag一個更好的名字),它是這樣的:

class Article < ActiveRecord::Base 
    has_many :taggings 
    has_many :tags, :through => :taggings 
end 

class Tag < ActiveRecord::Base 
    has_many :taggings 
    has_many :articles, :through => :taggings 
end 

class Tagging < ActiveRecord::Base 
    belongs_to :article 
    belongs_to :tag 
end 
+0

has_many:through選項非常適合將user_id放入標記中。 – MattMcKnight 2009-12-15 15:39:15

5

當關系是單向時,您應該使用has_many。一篇文章有​​很多標籤,但標籤也有很多文章,所以這不太合適。一個更好的選擇可能是has_and_belongs_to_many:文章有很多標籤,而這些標籤也引用文章。 A belongs_to B表示A引用B; A has_one B意味着b號A.

這裏的關係的總結,你可能會看到:

Article 
    has_and_belongs_to_many :tags # An article has many tags, and those tags are on 
            # many articles. 

    has_one     :author # An article has one author. 

    has_many    :images # Images only belong to one article. 

    belongs_to    :blog # This article belongs to one blog. (We don't know 
            # just from looking at this if a blog also has 
            # one article or many.) 
0

關閉我的頭頂,文章應該是:

has_many :article_tags 
has_many :tags, :through => :article_tags 
+0

爲什麼這個社區wiki? – 2009-12-15 15:04:13