У меня есть несколько моделей следующим образом:
class Examinee < ActiveRecord::Base
has_many :activities, as: :invoker
has_many :tests
def get_location
t = self.tests.last
l = nil
if t.blank?
a = self.activities.last
l = a.location unless a.blank?
else
l = t.location
end
l
end
end
class Test < ActiveRecord::Base
belongs_to :user
belongs_to :examinee
has_many :activities, as: :invoker
delegate :location, to: :user
end
class User < ActiveRecord::Base
belongs_to :location
has_many :tests
end
class Location < ActiveRecord::Base
has_many :activities
has_many :users
has_many :tests, through: :users
end
class Activity < ActiveRecord::Base
belongs_to :invoker, polymorphic: true
belongs_to :location
end
Теперь логика связывания examinee
с его собственным location
определена в методе get_location
.
Поскольку мне нужно перечислить испытуемых вместе с их ассоциированным location
, то, что я сейчас делаю в индексе examinees
, таково:
def index
@examinees = Examinee.preload(:activities, :tests).references(:locations).order(created_at: :desc)
end
Возник новый запрос клиента: отфильтровать этот список по местоположению. Естественно, я перепробовал все варианты where
:
@examinees.where(location_id: 2)
@examinees.where(location: {id: 2})
Examinee.preload(activities: :location, tests: :location).where(location_id: 2)
и еще несколько их вариантов. Ничего не работает Кто-нибудь здесь сталкивался с такой фильтрацией ассоциаций второго порядка?
EDIT:
Я могу заставить работать следующие запросы:
Examinee.joins(:activities, tests: :user).where(users: {location_id: 2})
Examinee.joins(:activities, tests: :user).where(activities: {location_id: 2})
но мне нужно их дизъюнкция (ИЛИ результат), который недоступен для Rails 4.