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