活动记录关联 - 一个模型可以同时属于不同的模型

时间:2016-11-15 18:26:45

标签: ruby-on-rails database activerecord rails-activerecord

为 -

的方案创建活动记录关系的正确方法是什么

模型A的一个实例可以同时属于另外两个模型(模型B和模型C)的多个实例。

模型B只能有一个模型A.

模型C可以有很多模型A

一个例子是一个工作委员会,雇主雇用一个职位,候选人正在申请,并有许多以前的职位。我希望候选人和雇主职位都来自同一模特。

位置模式(模型A)     同时属于雇主和候选人

雇主模型(模型B)    has_one职位

候选人模型(C型)    has_many职位

1 个答案:

答案 0 :(得分:1)

这是实现您在问题中描述的内容的一种方式:

class Position < ActiveRecord::Base
  belongs_to :candidate
  belongs_to :employer
end

class Employer < ActiveRecord::Base
  has_many :positions
end

class Candidate < ActiveRecord::Base
  has_many :positions
ens

请注意,一个职位一次只能属于一个雇主和一个候选人;如果你正在创建一个职位委员会,这有点荒谬 - 职位和雇主之间的关系可能是正确的,但是候选人可能有很多申请,而申请将属于某个职位,而职位则有很多申请。或者也可能是&#34;收藏夹&#34;所以候选人可以跟踪要申请的职位列表。

&#34;理论&#34;您开始使用的示例:

  • 模型A的一个实例可以同时属于另外两个模型(模型B和模型C)的多个实例。
  • 模型B只能有一个模型A.
  • 模型C可以有很多模型A

代码:

class ModelA < ActiveRecord::Base
  has_many :model_bs
  has_many :model_c_relationships # join table!
  has_many :model_cs, through: :model_c_relationships
end

class ModelB < ActiveRecord::Base
  belongs_to :model_a
end

class ModelCRelationship < ActiveRecord::Base
  belongs_to :model_a
  belongs_to :model_c
end

class ModelC < ActiveRecord::Base
  has_many :model_c_relationships
  has_many :model_as, through: :model_c_relationships
end

如果某种类型的对象可以属于另一个对象,但另一个对象可以是多种类型之一,则可能需要多态关联。例如,StackOverflow允许您对问题和答案进行评论。注释只能属于一个可注释的父对象,因此代码可能如下所示:

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
end

class Question < ActiveRecord::Base
  has_many :comments, as: :commentable
  has_many :answers
end

class Answer < ActiveRecord::Base
  belongs_to :question
  has_many :comments, as: :commentable
end