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

问题描述 投票:1回答:1

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

我正在尝试将用户或联系人分配为每个项目的“成员”。我最初认为这里的连接表就足够了,例如ProjectMembers,但是我在思考过程中遇到了一堵砖墙,当涉及到一个项目成员时,只允许它是ContactUser以及是否处理这个问题通过关系或模型或控制器中的代码检查user_idcontact_id之间的哪个不为空。

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

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

任何指针都将非常感激。

ruby-on-rails activerecord database-design relationship
1个回答
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。希望这可以帮助。

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.