我目前基本上有3个型号。我有Project
,User
和Contact
。
我正在尝试将用户或联系人分配为每个项目的“成员”。我最初认为这里的连接表就足够了,例如ProjectMembers
,但是我在思考过程中遇到了一堵砖墙,当涉及到一个项目成员时,只允许它是Contact
或User
以及是否处理这个问题通过关系或模型或控制器中的代码检查user_id
或contact_id
之间的哪个不为空。
我看一下看起来很有希望的多态关联,但不知怎的,我最后得到了关联(项目被输入ProjectMember
表作为类型,而不是User
或Contact
)并且更加困惑我自己。
我非常喜欢的最终输出只是能够运行类似Project.first.project_members
的东西并让那些成员返回该项目中的角色。如果我能运行User.first.projects
/ Contact.first.projects
并获得那些,那就更好了,但这是我可以弄清楚的事情。
任何指针都将非常感激。
多态关联是你应该去的地方。
首先:Project
与User
和Contact
有很多关系,因此你需要一个联接表。
第二:既然你需要调用类似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。希望这可以帮助。
谢谢