ActiveRecord: расширенные запросы с помощью include() или join()

Пытаюсь реализовать какой-то "умный" поиск с помощью ActiveRecord. Например, у меня есть две модели: User и Practice. Я хочу найти все практики только с активными пользователями.

Я пытаюсь добиться этого следующими способами:

Practice.joins(:users)
.where('LOWER(name) LIKE :search OR (LOWER(users.first_name) LIKE :search OR LOWER(users.last_name) LIKE :search)', search: "%#{params[:search].downcase}%")
.where(users: {removed_at: nil}).distinct.limit(10)

Это дает мне практику со всеми пользователями (как активными, так и удаленными).

Если я попробую другой вариант (используя include() вместо joins()):

Practice.includes(:users).where('LOWER(name) LIKE :search OR (LOWER(users.first_name) LIKE :search OR LOWER(users.last_name) LIKE :search)', search: "%#{params[:search].downcase}%")
                 .where(users: {removed_at: nil}).distinct.limit(10)

Я получаю правильную структуру объекта, когда имя практики вводится в качестве поискового запроса, но если я использую имя пользователя в качестве параметра поиска - я могу видеть только этого конкретного пользователя внутри практики, и я хочу, чтобы все активные пользователи были найдены практика в таком случае.

Не могли бы вы помочь мне понять, как этого добиться?

Заранее спасибо!


person TopaZ    schedule 11.12.2014    source источник


Ответы (1)


Попробуйте добавить условную ассоциацию:

has_many :active_users, -> {where(active: true)}, class_name: "User"

А затем используйте как includes, так и references

Practice.includes(:active_users).references(:users)...

Это работает в Rails 4.

person palkan    schedule 11.12.2014
comment
Спасибо за ответ, но иногда мне нужно получить всех пользователей, как активных, так и неактивных, поэтому я не могу добавить условную связь. - person TopaZ; 11.12.2014
comment
Вы можете использовать оба, любое их количество. Просто замените active_users на пользователей - person palkan; 11.12.2014
comment
Действительно, но это не работает, как ожидалось. Этот код также дает мне всех пользователей, а не только активных. - person TopaZ; 12.12.2014