为 -
的方案创建活动记录关系的正确方法是什么模型A的一个实例可以同时属于另外两个模型(模型B和模型C)的多个实例。
模型B只能有一个模型A.
模型C可以有很多模型A
。一个例子是一个工作委员会,雇主雇用一个职位,候选人正在申请,并有许多以前的职位。我希望候选人和雇主职位都来自同一模特。
位置模式(模型A) 同时属于雇主和候选人
雇主模型(模型B) has_one职位
候选人模型(C型) has_many职位
答案 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;您开始使用的示例:
代码:
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