2010-02-09 15 views
5

Si sta verificando un problema durante l'utilizzo di find_or_create_by in un'associazione has_manythrough.Errore durante l'utilizzo di `find_or_create_by` su un'associazione` 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 lancia un errore quando invoco find_or_create_by su roles associazione di un oggetto 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> 

sono stato in grado di risolvere il problema cambiando il mio codice come segue:

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

io sono curioso di scoprire se find_or_create_by opere con has_manythrough associazioni.

risposta

1

Funziona, ma non con :through.

+0

Sì, il problema è limitato a: attraverso. Aggiornerò la domanda per riflettere questo. –

+0

Non penso che otterrete più risposte su questo. I metodi 'find_or _...' non dovrebbero funzionare con le associazioni ': through'. L'unico modo per farlo funzionare sarebbe eliminare il modello 'Permission' e usare una relazione' has_and_belongs_to_many' con una semplice tabella di mappatura. –

+0

Chiamate come 'u.roles.find_by_rolename (" admin ")' funziona con 'has_many: through'. Quindi ho pensato che "u.roles.find_or_create_by_rolename (" admin ")" potrebbe funzionare. Puoi indicarmi la documentazione in cui è specificato questo avvertimento? –

Problemi correlati