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?

Respuestas a la pregunta(4)

Su respuesta a la pregunta