Tôi muốn có thể sử dụng hai cột trên một bảng để xác định mối quan hệ. Vì vậy, sử dụng một ứng dụng tác vụ làm ví dụ.
Nỗ lực 1:
class User < ActiveRecord::Base
has_many :tasks
end
class Task < ActiveRecord::Base
belongs_to :owner, class_name: "User", foreign_key: "owner_id"
belongs_to :assignee, class_name: "User", foreign_key: "assignee_id"
end
Vậy thì Task.create(owner_id:1, assignee_id: 2)
Điều này cho phép tôi thực hiện Task.first.owner
trả về người dùng một và Task.first.assignee
trả về người dùng hai nhưng User.first.task
không trả lại gì. Đó là vì nhiệm vụ không thuộc về người dùng, chúng thuộc về chủ sở hữu và người được chuyển nhượng . Vì thế,
Nỗ lực 2:
class User < ActiveRecord::Base
has_many :tasks, foreign_key: [:owner_id, :assignee_id]
end
class Task < ActiveRecord::Base
belongs_to :user
end
Điều đó hoàn toàn không thành công vì hai khóa ngoại dường như không được hỗ trợ.
Vì vậy, những gì tôi muốn là có thể nói User.tasks
và nhận được cả quyền sở hữu của người dùng và các nhiệm vụ được giao.
Về cơ bản bằng cách nào đó, xây dựng một mối quan hệ tương đương với một truy vấn Task.where(owner_id || assignee_id == 1)
Điều đó có thể không?
Cập nhật
Tôi không muốn sử dụng finder_sql
, nhưng câu trả lời không được chấp nhận của vấn đề này có vẻ gần với những gì tôi muốn: Rails - Multiple Index Key Association
Vì vậy, phương pháp này sẽ giống như thế này,
Nỗ lực 3:
class Task < ActiveRecord::Base
def self.by_person(person)
where("assignee_id => :person_id OR owner_id => :person_id", :person_id => person.id
end
end
class Person < ActiveRecord::Base
def tasks
Task.by_person(self)
end
end
Mặc dù tôi có thể làm cho nó hoạt động Rails 4
, tôi vẫn gặp lỗi sau:
ActiveRecord::PreparedStatementInvalid: missing value for :owner_id in :donor_id => :person_id OR assignee_id => :person_id