2012-02-19 20 views
8

tengo tres modelos, todos para una relación has_many: through. Se ven así:usando has_many: through y compilación

class Company < ActiveRecord::Base 

    has_many :company_users, dependent: :destroy 
    has_many :users, through: :company_users 

    accepts_nested_attributes_for :company_users, :users 

end 

class CompanyUser < ActiveRecord::Base 
    self.table_name = :companies_users #this is because this was originally a habtm relationship 
    belongs_to :company 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    # this is a devise model, if that matters 

    has_many :company_users, dependent: :destroy 
    has_many :companies, through: :company_users 

    accepts_nested_attributes_for :company_users, :companies 

end 

esto carga bien, y las uniones están bien diseñadas para las consultas. Sin embargo, cada vez que hago algo así como

@company = Company.last 
@user = @company.users.build(params[:user]) 

@user.save #=> true 
@company.save #=> true 

tanto el registro User y los CompanyUser registros se crean, pero el campo company_id en el registro CompanyUser se establece en NULL

INSERT INTO `companies_users` (`company_id`, `created_at`,`updated_at`, `user_id`) 
VALUES (NULL, '2012-02-19 02:09:04', '2012-02-19 02:09:04', 18) 

que hace lo mismo cuando usted @company.users << @user

Estoy seguro de que estoy haciendo algo estúpido aquí, simplemente no sé qué.

Respuesta

14

No se puede utilizar un has_many: a través de así, hay que hacerlo de esta manera:

@company = Company.last 
@user = User.create(params[:user]) 
@company.company_users.create(:user_id => @user.id) 

, entonces tendrá la asociación definido correctamente.

actualización

En el caso del comentario abajo, como ya tiene accepts_nested_attributes_for, sus parámetros tendrían que venir de esta manera:

{ :company => 
    { :company_users_attributes => 
     [ 
      { :company_id => 1, :user_id => 1 } , 
      { :company_id => 1, :user_id => 2 }, 
      { :company_id => 1, :user_id => 3 } 
     ] 
    } 
} 

Y habrían usuarios que se añade a las empresas automáticamente para usted.

+0

por lo que si desea permitir a alguien que corrija una empresa y les permite añadir usuarios con casillas de verificación que tendría que tirar de la matriz de user_ids el hash params y crear un registro CompanyUser ¿para cada uno? –

+0

complementó la respuesta anterior. –

+0

¡Gracias! eso era lo que me estaba perdiendo. Ni siquiera pensé en hacer la forma así. me llamó estúpido. –

4

Sospecho que su parámetro params[:user], de lo contrario su código parece estar limpio. We can use build method with 1..n and n..n associations too, vea here.

le sugiero que primero asegurarse de que sus asociaciones modelo funciona bien, para que abra la console y aplica los siguientes,

> company = Company.last 
=> #<Tcompany id: 1....> 
> company.users 
=> [] 
> company.users.build(:name => "Jake") 
=> > #<User id: nil, name: "Jake"> 
> company.save 
=> true 

Ahora bien, si los registros se salvan, fina, depurar los parámetros que pasan a método de construcción.

feliz :) depuración

Cuestiones relacionadas