Я хочу мати можливість використовувати два стовпці в одній таблиці для визначення відносин. Отже, використовуючи програму завдань як приклад.
Спроба 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
нічого не повертає. Це пояснюється тим, що завдання не належить користувачеві, а власнику та правонаступнику . Тому,
Спроба 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