2012-02-15 82 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