我希望能够在一个表中使用两列来定义关系.以任务应用程序为例.
Attempt 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
那么Task.create(owner_id:1, assignee_id: 2)
这允许我执行Task.first.owner
,返回user one,Task.first.assignee
,返回user two,但User.first.task
不返回任何内容.这是因为任务不属于用户,它们属于owner和assignee.所以
Attempt 2:
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)
个查询
可能吗?
Update
我不打算使用finder_sql
,但这个问题的答案似乎接近我想要的:Rails - Multiple Index Key Association
所以这个方法看起来是这样的,
Attempt 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
虽然我可以在Rails 4
分钟内让它工作,但我一直得到以下错误:
ActiveRecord::PreparedStatementInvalid: missing value for :owner_id in :donor_id => :person_id OR assignee_id => :person_id