2010-02-09 17 views
5

Bir has_manythrough ilişkilendirmesinde find_or_create_by kullanırken bir soruna yanıt veriyorum. Bir User nesnenin roles ilişkisi üzerine find_or_create_by çağırmak zaman`find_or_create_by` bir` has_many `` `` ilişkisinde kullanırken hata

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 

Raylar hata verir.

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

ı bulmak için merak ediyorum eğer has_manythrough derneklerle find_or_create_by çalışır:

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> 

Ben şöyle kodumu değiştirerek soruna başardı.

cevap

1

:through ile çalışır.

+0

Evet, sorun şu şekilde sınırlandı:. Soruyu yansıtacak şekilde güncelleyeceğim. –

+0

Bunun hakkında daha fazla cevap alacağınızı düşünmüyorum. 'Find_or _...' yöntemlerinin ':' 'dernekler ile çalışması gerekmez. Çalışmasını sağlayabilmenin tek yolu, 'Permission' modelini silerek ve basit bir haritalama tablosuyla bir 'has_and_belongs_to_many' ilişkisini kullanarak olacaktır. –

+0

"u.roles.find_by_rolename (" admin ") gibi çağrılar,' has_many: through' ile çalışır. Bu yüzden u.roles.find_or_create_by_rolename ("admin") 'ın çalışabileceğini düşündüm. Bu uyarının belirlendiği belgeye işaret edebilir misiniz? –