Chcę mieć możliwość użycia dwóch kolumn w jednej tabeli do zdefiniowania relacji. Na przykład na przykładzie aplikacji zadań.
Próba 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
A następnie Task.create(owner_id:1, assignee_id: 2)
To pozwala mi wykonać Task.first.owner
operację, która zwraca użytkownika pierwszego i Task.first.assignee
zwraca użytkownika drugiego, ale User.first.task
nic nie zwraca. Dzieje się tak, ponieważ zadanie nie należy do użytkownika, należą one do właściciela i cesjonariusza . Więc,
Próba 2:
class User < ActiveRecord::Base
has_many :tasks, foreign_key: [:owner_id, :assignee_id]
end
class Task < ActiveRecord::Base
belongs_to :user
end
To po prostu kończy się niepowodzeniem, ponieważ dwa klucze obce nie wydają się być obsługiwane.
Chcę więc móc powiedzieć User.tasks
i uzyskać zarówno należące do użytkowników, jak i przydzielone im zadania.
Zasadniczo w jakiś sposób zbuduj relację, która równałaby się zapytaniu Task.where(owner_id || assignee_id == 1)
Czy to jest możliwe?
Aktualizacja
Nie chcę używać finder_sql
, ale niedopuszczalna odpowiedź tego problemu wydaje się być bliska tego, czego chcę: Rails - Multiple Index Key Association
Więc ta metoda wyglądałaby następująco:
Próba 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
Chociaż mogę to uruchomić Rails 4
, pojawia się następujący błąd:
ActiveRecord::PreparedStatementInvalid: missing value for :owner_id in :donor_id => :person_id OR assignee_id => :person_id