Estoy trabajando en una aplicación que tiene los modelos User
y Project
y User
pueden asignarse a múltiples Project
s, a través de ProjectUser
, con un papel (por ejemplo, desarrollador, diseñador)Rails 3 has_many: + a través de condiciones de unión de mesa/determinación del alcance
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
puedo llamar @project.users
y @user.projects
, pero ya que hay variación de papeles, me gustaría ser un poco más específico con las relaciones. Idealmente, quiero ser capaz de hacer lo siguiente:
@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'
que actualmente tienen el siguiente código:
has_many :developers, :through => :project_users, :source => :user,
:class_name => "User",
:conditions => ['project_users.role = ?','Developer']
Pero esto sólo es realmente encargado de recuperar de una sola vía, y no me da mucho más: no puedo construir ni asignar ni nada.
Estoy intentando algo de lógica más compleja que creo que podría funcionar, pero agradecería algunos consejos:
has_many :developer_assignments, :source => :project_user,
:conditions => { :role => 'Developer' }
has_many :developers, :through => :developer_assignments # class_name?
¿Alguna sugerencia? ¡Gracias!
Gracias por su respuesta. Resuelve mi problema, pero no lo hace de la manera en que yo esperaba, mediante el uso de ámbitos en el modelo 'ProjectUsers'. Declarar ': conditions =>" project_users.role = '# {role}' "' no parece muy complicado, ya que me hubiera gustado llamar algo como ': conditions => {: scope =>: developer}' . Todavía estoy seguro de que esto es posible de alguna manera. De cualquier forma, te otorgaré la recompensa por tu esfuerzo, aunque esta respuesta no estará marcada como correcta. ¡Gracias por tu contribución! – Jeriko
Gracias. Realmente esperaba 'has_many: designers,: through =>: project_users,: source =>: user,: conditions => {: project_users => {: role =>: designer}}' trabajar de forma automática, pero aparentemente anidado hashes no tienen alcance con compilar y crear. Esto fue lo mejor que se me ocurrió. – HectorMalot
¿Qué es 'proxy_owner' en el de arriba? ¿Es esa referencia al otro lado de la assiociation, similar a 'proxy_association' que obtienes con': extend'? – sbeam