相关模型可以是其他两个模型之一

时间:2017-12-21 12:27:22

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

目前我基本上有3个型号。我有ProjectUserContact

我试图将用户或联系人分配为某种“会员”。到每个项目。我最初认为这里的链接表就足够了,例如ProjectMembers但是我在思考过程中遇到了一个砖墙,当涉及到一个项目成员只允许{{1}或Contact以及是否通过关系或模型或控制器中的代码处理此问题,方法是检查Useruser_id之间的哪个不为空。

我看一下看起来很有希望的多态关联,但不知怎的,我最终得到了关联(项目被输入到contact_id表作为类型,而不是ProjectMember或{{ 1}})并使自己更加困惑。

我非常喜欢的最终输出只是能够运行类似User的内容并让这些成员返回该项目中的角色。如果我可以运行Contact / Project.first.project_members并获得这些内容,那就更好了,但这是我可以理解的事情。

任何指针都会非常感激。

1 个答案:

答案 0 :(得分:0)

多态关联是你应该去的地方。
首先: ProjectUserContact有多对多的关系,因此您需要一个联接表。
第二:由于您需要调用类似Project.first.project_members的内容,因此您应该具有多态关联。
对于此方案,您应该创建polymorphic join table
假设你有ProjectMember的多态表memberable_id, memberable_type and project_id(我有railcasts的悬念)。

class ProjectMember < ActiveRecord::Base
  belongs_to :memberable, :polymorphic => true
  belongs_to :project
end

然后在您的User模型中

class User < ActiveRecord::Base
  has_many :project_members, :as => :memberable
  has_many :projects, through: :project_members
end

并在Contact模型中

class Member < ActiveRecord::Base
      has_many :project_members, :as => :memberable
      has_many :projects, through: :project_members
end

并在您的Project模型中

class Project < ActiveRecord::Base
   has_many :users, :through => :project_members, :source => :memberable, :source_type => 'User'
   has_many :contacts, :through => :project_members, :source => :memberable, :source_type => 'Contact'
   has_many :project_members

end

现在,您可以调用所需的关联,Project.first.project_members,User.first.projects或Contact.first.projects。希望这会有所帮助。

由于