2010-02-09 15 views
5

Estoy corriendo hacia un problema al usar find_or_create_by en una asociación has_manythrough.Error al usar `find_or_create_by` en una asociación` has_many` `through`

class Permission < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 
end 

class Role < ActiveRecord::Base 
    # DB columns: user_id, role_id 

    has_many :permissions 
    has_many :users, :through => :permissions 
end 

class User 
    has_many :permissions 
    has_many :roles, :through => :permissions 
end 

Rails lanza un error cuando invoco find_or_create_by en roles asociación de un objeto User.

u = User.first 
u.roles.find_or_create_by_rolename("admin") 

# Rails throws the following error 
# NoMethodError: undefined method `user_id=' for #<Role id: nil, rolename: nil, 
# created_at: nil, updated_at: nil> 

que fue capaz de evitar el problema cambiando el código como sigue:

unless u.roles.exists?(:rolename => "admin") 
    u.roles << Role.find_or_create_by_rolename("admin") 
end 

tengo curiosidad de encontrar si find_or_create_by obras con has_manythrough asociaciones.

Respuesta

1

Funciona, pero no con :through.

+0

Sí, el problema se limita a: a través de. Actualizaré la pregunta para reflejar eso. –

+0

No creo que obtengas más respuestas en este caso. Se supone que los métodos 'find_or _...' no funcionan con las asociaciones ': through'. La única forma en que podría hacerlo funcionar sería eliminar el modelo 'Permiso' y usar una relación' has_and_belongs_to_many' con una tabla de asignación simple. –

+0

Llamadas como 'u.roles.find_by_rolename (" admin ")' funciona con 'has_many: through'. Así que pensé que 'u.roles.find_or_create_by_rolename (" admin ")' podría funcionar. ¿Puede indicarme la documentación donde se especifica esta advertencia? –

Cuestiones relacionadas