【发布时间】:2014-08-29 18:57:13
【问题描述】:
我希望能够使用一张表上的两列来定义关系。因此以任务应用程序为例。
尝试 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 返回用户一 和Task.first.assignee 返回用户二 但User.first.task 什么也不返回。这是因为任务不属于用户,它们属于 owner 和 assignee。所以,
尝试 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 - Multiple Index Key Association
所以这个方法看起来像这样,
尝试 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
【问题讨论】:
-
感谢您的信息,但这不是我要找的。我想要查询任何一个或列是给定值。不是复合主键。
-
是的,更新说明了这一点。忘记宝石。我们都认为您只想使用组合主键。至少通过将自定义范围定义为范围关系,这应该是可能的。有趣的场景。我稍后再看看
-
FWIW 我的目标是获取给定的用户任务并保留 ActiveRecord::Relation 格式,以便我可以继续对结果使用任务范围进行搜索/过滤。
标签: ruby-on-rails ruby-on-rails-4 associations model-associations