1つのテーブルで2つの列を使用して、関係を定義できるようにしたい。したがって、例としてタスクアプリを使用します。
試行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
どちらがユーザー1Task.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
2つの外部キーがサポートされていないように見えるため、これは完全に失敗します。
ですから、私が望んでいるのは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