Использование arel
может привести вас к довольно далеко. Трудная часть заключается в том, как вы не пишете весь свой запрос, используя собственный синтаксис запроса arel
?
Вот трюк: при построении запроса с использованием where
, если вы используете arel
условия, вы можете получить дополнительные методы для бесплатного скачивания. Например, вы можете заключить подзапрос, который у вас там, с .exists.not
, который доставит вам (NOT (EXISTS (subquery)))
. Положите его на where
-clause, и вы установите его.
Вопрос в том, как вы ссылаетесь на связанные таблицы? Для этого вам нужен Арел. Вы можете использовать Arel's where
с его уродливыми условиями, такими как a.eq b
. Но почему? Поскольку это условие равенства, вы можете использовать условия Rails вместо этого!Вы можете ссылаться на таблицу, которую вы запрашиваете, с помощью хеш-ключа, но для другой таблицы (во внешнем запросе) вы можете использовать ее arel_table
. Смотреть это:
parents = Parent.arel_table
Parent.where(
Child.where(other_parent_id: nil, parent_id: parents[:id]).exists.not
)
Вы можете даже уменьшить использование Arel, прибегая к натягивает немного и опираясь на тот факт, что вы можете кормить в подзапросов в качестве параметров Rails' where
. Для этого не так много пользы, но это не заставляет вас слишком много копаться в методах Arel, поэтому вы можете использовать этот трюк или другие операторы SQL, которые принимают подзапрос (есть ли какие-либо другие?):
parents = Parent.arel_table
Parent.where('NOT EXISTS (?)',
Child.where(parent_id: parents[:id], other_parent_id: nil)
)
две основные точки здесь:
- вы можете построить подзапросы точно так же, как вы привыкли к созданию регулярных запросов, ссылок таблицы внешнего запроса с Arel. Возможно, это даже не настоящая таблица, это может быть псевдоним! Сумасшедший.
- Вы можете использовать подзапросы в качестве параметров для метода Rails
where
просто отлично.
Модели 'OtherParent' и' Parent' отличаются? –
Можете ли вы показать ассоциации моделей? –
Это называется Точное реляционное подразделение. См. Http://dba.stackexchange.com/questions/45829/what-is-the-name-of-this-type-of-query-and-what-is-an-efficient-example –