我希望能够在一个表上使用两列来定义一种关系。因此,以任务应用为例。
尝试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
返回用户1和Task.first.assignee
返回用户2但User.first.task
什么也不返回的操作。这是因为任务不属于用户,它们属于所有者和受让人。所以,
尝试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)
那可能吗?
更新资料
我不想使用finder_sql
,但是这个问题的不可接受的答案似乎与我想要的接近:Rails-多个索引键关联
所以这个方法看起来像这样,
尝试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