Я хочу иметь возможность использовать два столбца в одной таблице для определения отношений. Таким образом, использование приложения-задачи в качестве примера.
Попытка 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
, который возвращает user one и 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)
Возможно ли это?
Update
Я не хочу использовать 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