Как вы делаете or
запрос в Rails 5 ActiveRecord? Кроме того , возможно приковать or
с where
в ActiveRecord запросов?
ruby-on-rails
ruby
activerecord
ruby-on-rails-5
rails-activerecord
К.М. Ракибул Ислам
источник
источник
Ответы:
Возможность связывать
or
предложение вместе сwhere
предложением вActiveRecord
запросе будет доступна в Rails 5 . См. Соответствующее обсуждение и запрос на перенос .Итак, в Rails 5 вы сможете делать следующее :
Чтобы получить
post
сid
1 или 2:Еще несколько примеров:
(A && B) || C:
(A || B) && C:
источник
Post.where(a).or(Post.where(b)).where(Post.where(c).or(Post.where(d)))
создать (a || b) && (c || d)ArgumentError: Unsupported argument type: #<MyModel::ActiveRecord_Relation:0x00007f8edbc075a8> (MyModel::ActiveRecord_Relation)
Нам не нужно ждать, пока rails 5 будет использовать этот
OR
запрос. Мы также можем использовать его сrails 4.2.3
. Существует портировать здесь .Спасибо Эрику-Гуо за драгоценный камень where-or. Теперь мы можем добавить эту
OR
функциональность и в>= rails 4.2.3
этот драгоценный камень.источник
(Просто дополнение к ответу К.М. Ракибула Ислама.)
Используя области видимости, код может стать красивее (в зависимости от того, какие глаза смотрят):
источник
Мне нужно было сделать
(A && B) || (C && D) || (E && F)
Но в
5.1.4
текущем состоянии Rails это слишком сложно сделать с помощью Arel or-chain. Но я по-прежнему хотел использовать Rails для генерации как можно большего количества запросов.Итак, я сделал небольшой взлом:
В моей модели я создал частный метод под названием
sql_where
:Затем в своей области я создал массив для хранения OR
Который даст ожидаемый результат запроса:
SELECT * FROM `models` WHERE ((A AND B) OR (C AND D) OR (E AND F))
.И теперь я могу легко комбинировать это с другими областями и т. Д. Без каких-либо неправомерных операций.
Прелесть в том, что мой sql_where принимает обычные аргументы where-clause:
sql_where(name: 'John', role: 'admin')
будет сгенерирован(name = 'John' AND role = 'admin')
.источник
.merge
как эквивалент && и построить правильное дерево для захвата ваших родителей. Что-то вроде ...(scopeA.merge(scopeB)).or(scopeC.merge(scopeD)).or(scopeE.merge(scopeF))
, если предположить, что каждый из прицелов выглядит примерно такModel.where(...)
В Rails 5 есть возможность использовать
or
предложенияwhere
. Например.источник