12

tengo un modelo User que tiene muchas projects y un modelo Project que puede tener muchas users, pero también pertenece a un único usuario (es decir, el usuario que ha creado este proyecto). Debe pertenecer a un User. También permite que una lista de usuarios se asocie con ella, piense en colaboración.Carriles tiene muchos y pertenece a una

Con esto en mente, mis modelos se parecen a esto:

class User < ActiveRecord::Base 
    has_many :assigned_projects 
    has_many :projects, :through => :assigned_projects 
end 

class Project < ActiveRecord::Base 
    belongs_to :user 
    has_many :assigned_projects 
    has_many :users, :through => :assigned_projects 
end 

class AssignedProject < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :project 
end 

Ahora, cuando quiero crear un nuevo proyecto a través de un User, esta es la forma en que lo haría:

user = User.create(:name => 'injekt') 
user.projects.create(:name => 'project one') 

Ahora, sé que projects se proporciona a través de un modelo de unión AssignedProject, por lo que project.user devolverá nil. Lo que estoy luchando para conseguir mi cabeza alrededor es la mejor manera de asignar el creador del proyecto (que por cierto no se necesidad ser user, podría ser creator o algo más descriptivo, con tal de que es de tipo User).

La idea entonces es crear un método para devolver projects_created de un User que seleccionará únicamente los proyectos creados por este usuario. Donde user.projects, por supuesto, devolverá TODOS los proyectos con los que esté asociado un usuario.

Suponiendo que este tipo de asociación es bastante común, ¿cuál es la mejor manera de lograr lo que quiero? Cualquier dirección es muy apreciada.

Respuesta

20

añadir una columna creator_id a su mesa proyectos para la relación creador, y luego agregar las asociaciones de los modelos:

class User < ActiveRecord::Base 
    has_many :assigned_projects 
    has_many :projects, :through => :assigned_projects 

    has_many :created_projects, :class_name => "Project", :foreign_key => :creator_id 
end 

class Project < ActiveRecord::Base 
    belongs_to :user 
    has_many :assigned_projects 
    has_many :users, :through => :assigned_projects 

    belongs_to :creator, :class_name => "User", :foreign_key => :creator_id 
end 

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

+0

Gracias por su respuesta, este no fue mi problema. Era: * Lo que me cuesta entender es la mejor manera de asignar el creador del proyecto (que, por cierto, no necesita ser usuario, podría ser creador o algo descriptivo, siempre que sea de tipo Usuario). * –

+0

@Nuby ¿seguro de qué? Seguro que estoy luchando por asimilar el usuario/creador del proyecto de forma automatizada. sí –

+0

A menos que malinterprete la respuesta de @ Pavling (y su pregunta), lo que está proponiendo es que cree una segunda relación con la tabla de usuarios, llamada 'Creador'. A continuación, puede llamar a 'Project.creator' para obtener el usuario asociado de la asociación' CreatedProjects'. Eso resolvería (creo) tu problema. En cuanto a cómo asignarlo, podría hacer un gancho 'before_create' en el modelo para asignar esto al usuario que está actualmente conectado, o a algún otro usuario (dependiendo de la lógica de su proyecto). – Nuby

1

que quería añadir pocas mejoras al diseño. En realidad, no necesitamos un modelo intermedio porque no contiene ninguna columna adicional que no sea reference_ids, por lo que la asociación HABTM es más adecuada aquí.

class User < ActiveRecord::Base 
    has_and_belongs_to_many :projects, :join_table => :assigned_projects 
    has_many :created_projects, :class_name => "Project", :foreign_key => :creator_id 
end 

class Project < ActiveRecord::Base 
    has_and_belongs_to_many :users, :join_table => :assigned_projects 
    belongs_to :creator, :class_name => "User", :foreign_key => :creator_id 
end 
+0

¿De verdad? ¿No le importa qué rol le asigna un usuario a un proyecto dado, o cuál es su fecha de asignación, o cualquier otra información relevante para la participación de ese usuario en ese proyecto específico? Estarás refabricando ese HABTM a un HMT antes de fin de mes ;-) – Pavling

+0

@Ejecutando de qué usuario 'role' estás hablando? No te estoy metiendo en esto. ¿Hay alguna necesidad de fecha en que se realizó la asignación del proyecto? Si hay columnas adicionales allí, entonces 'has_many through' podría ser la mejor opción. –

+1

En un proyecto, el usuario puede asumir el rol de Líder Técnico, en otro puede ser un Probador de UI. Es posible que no desee esta información específica (o la fecha de asignación): es solo un ejemplo; pero * usted * querrá más información que solo * quién * está en un proyecto. Claro, las relaciones tipo HABTM tienen su lugar, pero en realidad, * este * uno será un HMT. – Pavling

Cuestiones relacionadas