2010-02-09 35 views
5

Tôi đang gặp sự cố khi sử dụng find_or_create_by trên liên kết has_manythrough.Lỗi khi sử dụng `find_or_create_by` trên liên kết` has_many` `qua`

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 ném một lỗi khi tôi gọi find_or_create_by trên roles hiệp hội của một đối tượng 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> 

tôi đã có thể làm việc xung quanh vấn đề bằng cách thay đổi mã của tôi như sau:

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

Tôi tò mò muốn tìm nếu find_or_create_by làm việc với has_manythrough hiệp hội.

Trả lời

1

Tính năng này hoạt động nhưng không hoạt động với :through.

+0

Có, vấn đề được giới hạn trong: thông qua. Tôi sẽ cập nhật câu hỏi để phản ánh điều đó. –

+0

Tôi không nghĩ rằng bạn sẽ nhận được thêm bất kỳ câu trả lời nào cho câu trả lời này. Các phương thức 'find_or _...' không được phép làm việc với các liên kết ': through'. Cách duy nhất bạn có thể làm cho nó hoạt động là xóa mô hình 'Permission' và sử dụng mối quan hệ' has_and_belongs_to_many' với một bảng ánh xạ đơn giản. –

+0

Các cuộc gọi như 'u.roles.find_by_rolename (" admin ")' hoạt động với 'has_many: thông qua'. Vì vậy, tôi nghĩ rằng 'u.roles.find_or_create_by_rolename (" admin ")' có thể hoạt động. Bạn có thể chỉ cho tôi tài liệu hướng dẫn nơi báo trước này được chỉ định không? –

Các vấn đề liên quan