belongs_to一组类

时间:2011-12-03 18:05:54

标签: ruby-on-rails ruby-on-rails-3 belongs-to

我有一种情况,我在概念上正在努力。我有一个班级Media,它代表(不出所料)一种媒体。现在,有许多不同的类拥有Media - 例如,Question可以拥有Media个对象,Answer也可以拥有Mediahas_one对象

尝试从拥有类的方向对此进行建模很容易,我只是给它们适当的has_manybelong_to关联。但是,我正朝着另一个方向奋斗。媒体不会belongs_to任何特定的类,它可以属于任何一组类。

我怀疑在这些模棱两可的时刻要做的恰当的事情就是不要用任何{{1}}关联注释该类。但是,我找不到任何证明这一点的文件。

3 个答案:

答案 0 :(得分:2)

您正在寻找的是多态关系。

class Media < ActiveRecord::Base
  belongs_to :mediable, :polymorphic => true
end

class Question < ActiveRecord::Base
  has_many :media, :as => :mediable
end

class Answer < ActiveRecord::Base
  has_many :media, :as => :mediable
end

我回答了一个类似的问题,即同一媒体可能属于多个模型。您可能会发现该答案很有用。 https://stackoverflow.com/a/8237597/367611

答案 1 :(得分:1)

您正在做的是教科书多态关联。这些指南很有用。

http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

  

关联的稍微更高级的转折是多态关联。通过多态关联,模型可以属于单个关联上的多个其他模型。例如,您可能拥有属于员工模型或产品模型的图片模型。

答案 2 :(得分:1)

应该注意的是,没有什么能阻止你这样做:

class Media < ActiveRecord::Base
  belongs_to :question
  belongs_to :answer
end

但是,这种方法的最大缺点是在媒体表中你必须有两个可以为空的外键列 - question_idanswer_id

如果您想将媒体附加到另一个类,则必须将另一个可以为空的外键列添加到媒体表中。

为了解决这个问题,Rails为您提供了多态关联 - 使用它们,媒体可以属于许多其他模型,所有这些都通过一个关联。

所以现在你可以像@Sean Hill回答你的问题那样建立你的联想模型:

class Media < ActiveRecord::Base
  belongs_to :mediable, :polymorphic => true
end

class Question < ActiveRecord::Base
  has_many :media, :as => :mediable
end

# etc.

您的媒体表只代表一对列的多态关联:mediable_id(某个整数)和mediable_type(&#39;问题&#39;或者&#39;答案&#39 ;)

不要忘记您还需要将列添加到相关迁移中(CreateMedia迁移 - 根据需要进行调整):

t.integer :mediable_id
t.string  :mediable_type

或者更简单地说,只有一列:

t.references :mediable, :polymorphic => true