2016-06-28 3 views
0

Как я могу получить всех родителей, у которых нет детей или детей, если его «состояние» отличается от «одобрено»?Запрос ассоциации на основе дочернего атрибута

Parent.includes(:children).where.not(children: { status: 'approved' })

"SELECT \"parents\".* FROM \"parents\" INNER JOIN \"children\" ON  "children\".\"parent_id\" = \"parents\".\"id\" WHERE \"children\".\"state\" = 'approved'" 

возвращает только родители с детьми с status отличному от approved, но игнорирует родителей, что не имеет детей

Parent.includes(:children).where(children: { id: nil })

"SELECT \"parents\".\"id\" AS t0_r0, \"parents\".\"date\" AS t0_r1, ........, \"parents\".\"slug\" AS t0_r33, \"children\".\"id\" AS t1_r0, \"children\".\"parent_id\" AS t1_r1, \"children\".\"request_state\" AS t1_r8 FROM \"parents\" LEFT OUTER JOIN \"children\" ON \"children\".\"edition_id\" = \"parents\".\"id\" WHERE \"children\".\"id\" IS NULL" 

возвращает только родители без детей

+0

Какого Rails версии вы используете? –

+0

Rails 4.2.5, добавлен тег, ty –

+0

Вы проверили вопросы о запросе 'или', [как этот] (http://stackoverflow.com/questions/7976358/activerecord-arel-or-condition)? –

ответ

1

Итак, вам нужно объединить два условия.

Поскольку includes поддерживает только хеш, как условие в where статье, поэтому мы должны использовать references записать условие в SQL source

Используя где, как это будет работать только тогда, когда вы передаете его Hash. Для SQL-фрагментов вам нужно использовать ссылки, чтобы заставить объединение таблиц

Parent.includes(:children).where("children.status <> 'approved' OR children.id IS NULL").references(:children) 

Дайте этот выстрел

+0

luskeskywalker, вы сделали это, спасибо –

+0

никаких проблем, удачи – lusketeer

Смежные вопросы