我希望能够在一个表上使用两列来定义关系。以任务应用程序为例。
第一次尝试:
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
然后是 Task.create(owner_id:1, assignee_id: 2)
这允许我执行返回 用户一的 Task.first.owner
和返回 二号使用者但是没有返回任何值的 Task.first.assignee
。这是因为任务不属于用户,它们属于 主人和 受托人。那么,
第二次尝试:
class User < ActiveRecord::Base
has_many :tasks, foreign_key: [:owner_id, :assignee_id]
end
class Task < ActiveRecord::Base
belongs_to :user
end
由于两个外键似乎不受支持,所以这种方法完全失败了。
所以我想要的是能够说 User.tasks
并且得到用户拥有和分配的任务。
基本上,以某种方式建立一个关系,将等于一个 Task.where(owner_id || assignee_id == 1)
查询
这可能吗?
我不期待使用 finder_sql
,但这个问题的未被接受的答案看起来接近我想要的: Rails-多索引密钥关联
这个方法看起来像这样,
第三次尝试:
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
尽管我可以让它在 Rails 4
中工作,但我不断得到以下错误:
ActiveRecord::PreparedStatementInvalid: missing value for :owner_id in :donor_id => :person_id OR assignee_id => :person_id