Вы можете возиться с подзапросами и, возможно, получить что-то работающее:
User.where(authenticable: Guardian.where(school_id: some_value))
Если вы используете Rails 5, они добавили .or
к ActiveRecord
, так что вы можетеобъедините некоторые из них, например:
User.where(authenticable: Guardian.where(school_id: some_value))
.or.where(authenticable: Student.where(school_id: some_value))
merge
- это еще один метод, который может дать некоторые результаты:
User.all.merge(Guardian.where(school_id: some_value))
Я не слишком знаком с запросами по полиморфным таблицам, поэтому ваш пробегможет варьироваться в зависимости от вышеизложенного.В худшем случае вам может потребоваться выполнить несколько запросов для сохранения области действия:
user_ids = Guardian.joins(:user).select('users.id').where(school_id: some_value).pluck(:user_id) +
Student.joins(:user).select('users.id').where(school_id: some_value).pluck(:user_id)
users = User.where(id: user_ids)
Возможно, вы застряли со схемой сейчас, но если вы можете ее изменить, она выглядиткак будто вам может быть лучше с отношениями наследования одной таблицы:
class User < ActiveRecord::Base
belongs_to :school
end
class Student < User
end
class Guardian < User
end
Тогда вы просто скажете:
User.where(school_id: some_value)
Я обнаружил, что полиморфные отношения доставляют больше хлопот, чем ониВо многих случаях это стоит из-за того, что трудно выполнять такие вещи, как запросы и массовые обновления, а также из-за невозможности использования ограничений внешнего ключа.Если подумать немного, обычно есть разумная модель данных, которая хорошо работает без них.