5
Tôi đang gặp sự cố khi sử dụng find_or_create_by
trên liên kết has_many
through
.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_many
through
hiệp hội.
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 đó. –
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. –
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? –