2010-02-09 53 views
5

我在has_manythrough關聯中使用find_or_create_by時遇到了問題。當我roles相關聯的User對象的調用find_or_create_by通過`has_many```通過`關聯使用`find_or_create_by`時出錯

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 

滑軌引發錯誤。

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> 

我能夠改變我的代碼來解決如下問題:

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

我好奇地發現,如果find_or_create_by作品與has_manythrough協會。

回答

1

它的工作原理,但不適用於:through

+0

是的,問題侷限於:通過。我會更新這個問題來反映這一點。 – 2010-02-09 22:13:00

+0

我不認爲你會得到任何更多的答案在這一個。 'find_or _...'方法不應該與':through'關聯一起工作。 您可以通過刪除'Permission'模型並使用'has_and_belongs_to_many'關係和一個簡單的映射表來實現它的唯一方法。 – 2010-02-09 22:18:39

+0

調用'u.roles.find_by_rolename(「admin」)''與'has_many:through'配合使用。所以我想'u.roles.find_or_create_by_rolename(「admin」)'可能會工作。你能指點我指定這個警告的文檔嗎? – 2010-02-09 22:33:00