2012-02-15 88 views
4

我希望有3種類型的對象來構建一個簡單的應用:可以屬於多個其他對象的對象的模型設計?

  • 文章(RoR中的第一天,爲什麼PHP仍然是真棒,回報率與PHP)
  • 作者(鮑勃,史蒂夫,仁)
  • 標籤(ROR,PHP)

一位作者撰寫的文章,並作出適當的標籤。

這樣:

author has many articles; article belongs to author 

但怎麼樣的標籤?我希望文章和作者都有標籤。

我可以想象:

author has many tags; article has many tags 
關於標籤模型聲明

可是什麼?

tag belongs to authors; tag belongs to articles 

兩者是否會相互干擾?

我擔心的是標籤將需要作者和文章的父母。並且如果它有父類型的兩種類型,那麼刪除一個會由於數據庫中的外鍵約束而刪除標籤和其他父項。

在此先感謝!

回答

6

您正在尋找polymorphyc associations

class Tag < ActiveRecord::Base 
    belongs_to :taggable, :polymorphic => true 
end 

class Author < ActiveRecord::Base 
    has_many :tags, :as => :taggable 
end 

class Article < ActiveRecord::Base 
    has_many :tags, :as => :taggable 
end 
+0

這是非常有用的。我有人告訴我,我應該聲明belongs_to:author; belongs_to:文章同時在標籤中。這種方法有什麼區別和潛在的優點/缺點? – rickypai 2012-02-15 14:54:01

+1

主要區別在於,如果聲明2個belongs_to行,那麼您需要在表中包含2個外鍵,並且如果您將擁有更多可標記的事物 - 則需要將外鍵添加到您的表中。 polymorphyc協會將使用1鍵和1列處理類型。你可以使用它,就像你使用通用的assciation一樣:tag.authors,tag.articles,article.tag等 – alony 2012-02-15 15:32:40

+1

所以我的理解是多態關聯只會允許每個標籤有一個屬性。這樣可以防止標籤同時屬於多個作者和文章。看起來像belongs_to:作者; belongs_to:文章的方法會更好。 – rickypai 2012-02-16 03:15:43