Фильтрация ассоциаций второго порядка Rails - PullRequest
0 голосов
/ 29 марта 2019

У меня есть несколько моделей следующим образом:

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.

...