Rails / ActiveRecord has_many through: asociación en objetos no guardados
Trabajemos con estas clases:
class User < ActiveRecord::Base
has_many :project_participations
has_many :projects, through: :project_participations, inverse_of: :users
end
class ProjectParticipation < ActiveRecord::Base
belongs_to :user
belongs_to :project
enum role: { member: 0, manager: 1 }
end
class Project < ActiveRecord::Base
has_many :project_participations
has_many :users, through: :project_participations, inverse_of: :projects
end
A user
puede participar en muchosprojects
con un rol comomember
o unmanager
. El modelo de conexión se llamaProjectParticipation
.
Ahora tengo un problema al usar las asociaciones en objetos no guardados. Los siguientes comandos funcionan como creo que deberían funcionar:
# first example
u = User.new
p = Project.new
u.projects << p
u.projects
=> #<ActiveRecord::Associations::CollectionProxy [#<Project id: nil>]>
u.project_participations
=> #<ActiveRecord::Associations::CollectionProxy [#<ProjectParticipation id: nil, user_id: nil, project_id: nil, role: nil>]>
Hasta ahora todo bien - AR creó elProjectParticipation
solo y puedo acceder alprojects
de unuser
conu.projects
.
Pero no funciona si creo elProjectParticipation
por mi mismo:
# second example
u = User.new
pp = ProjectParticipation.new
p = Project.new
pp.project = p # assign project to project_participation
u.project_participations << pp # assign project_participation to user
u.project_participations
=> #<ActiveRecord::Associations::CollectionProxy [#<ProjectParticipation id: nil, user_id: nil, project_id: nil, role: nil>]>
u.projects
=> #<ActiveRecord::Associations::CollectionProxy []>
¿Por qué están vacíos los proyectos? No puedo acceder a los proyectos poru.projects
como antes.
Pero si paso por las participaciones directamente, el proyecto aparece:
u.project_participations.map(&:project)
=> [#<Project id: nil>]
¿No debería funcionar como el primer ejemplo directamente:u.projects
devolverme todos los proyectos sin depender de si creo o no el objeto de unión. ¿O cómo puedo hacer que AR se dé cuenta de esto?