我的工作具有模型User
和Project
,并且User
可以分配给多个Project
秒的应用程序,通过ProjectUser
,与角色(如开发人员,设计师)。Rails 3中的has_many:通过加入+表条件/作用域
Project
has_many :project_users
has_many :users, :through => :project_users
User
has_many :project_users
has_many :projects, :through => :project_users
ProjectUser (user_id, project_id, role)
belongs_to :user
belongs_to :project
我可以打电话@project.users
和@user.projects
,但既然有不同的角色,我想成为一个更具体一点与关系。理想情况下,我希望能够做到以下几点:
@project.developers
# returns @project.users, but only where ProjectUser.role = 'Developer'
@project.designers << @user
# creates a ProjectUser for @project, @user with role 'Designer'
@user.development_projects
# returns projects where @user is assigned as a 'Developer'
@user.design_projects << @project
# creates a ProjectUser for @project, @user with role 'Designer'
目前,我有以下代码:
has_many :developers, :through => :project_users, :source => :user,
:class_name => "User",
:conditions => ['project_users.role = ?','Developer']
但这只是确实在获取单向的,并且不给我别的 - 我不能建立或分配任何东西。
我试图一些更复杂的逻辑,我认为可能的工作,但希望得到一些指点:
has_many :developer_assignments, :source => :project_user,
:conditions => { :role => 'Developer' }
has_many :developers, :through => :developer_assignments # class_name?
有什么建议?谢谢!
谢谢您的回答。它解决了我的问题,但并未按照我希望的方式这样做 - 通过在“ProjectUsers”模型上使用范围。 声明':conditions =>“project_users.role ='#{role}'”'看起来好像不是很有道理,因为我喜欢调用像':conditions => {:scope =>:developer}' 。我仍然肯定这是可能的。无论哪种方式,我都会奖励你为你付出的努力,尽管这个答案不会被标记为正确的。感谢您的输入! – Jeriko
谢谢。我真的希望'has_many:designers,:through =>:project_users,:source =>:user,:conditions => {:project_users => {:role =>:designer}}'自动工作,但显然是嵌套条件哈希不在构建和创建范围内。这是我能想到的最好的。 – HectorMalot
以上是什么'proxy_owner'?是指对assiociation的另一方,类似于你用':extend'得到的'proxy_association'? – sbeam