Есть ли в Rails 4 поддержка запросов ИЛИ?

Таким образом, в Rails 4 была добавлена ​​долгожданная функция использования not запросов.

Article.where.not(title: 'Rails 3')

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

Очевидно, я пытался

Article.where(title: 'Rails 3').or(title: 'Rails 4')

Но это не работает.


person Arjan    schedule 19.06.2013    source источник
comment
если вам нравится синтаксис Article.where(title: 'Rails 3').or(title: 'Rails 4'), вы можете использовать rails_or.   -  person khiav reoy    schedule 02.01.2017


Ответы (7)


Article.where(title: ['Rails 3', 'Rails 4'])

как бы вы сделали это в Active Record.

Невозможно воспроизвести любой произвольный SQL-запрос с использованием синтаксиса «Rails-y». Но вы всегда можете просто передать буквальный sql.

Итак, вы также можете сделать:

Article.where("articles.title = 'Rails 3' OR articles.title = 'Rails 4'")
person gregates    schedule 19.06.2013
comment
Правда в этом случае. Но это не сработает для более сложных условий. - person Arjan; 19.06.2013
comment
Вот чего я боялся. Я знаю, что вы можете сделать это с помощью произвольного sql. Но именно этого я и пытался избежать. Я надеялся, что, поскольку они добавили not запросы, они также будут поддерживать or запросы. - person Arjan; 19.06.2013
comment
Очевидно, я не могу говорить о планах на будущее основной команды rails! Вы можете попробовать открыть проблему в репозитории github. - person gregates; 19.06.2013
comment
Я мог бы, или я продолжу и попробую предложение @PriteshJ. При этом ваш ответ правильный, и я приму его сейчас. - person Arjan; 19.06.2013
comment
Я думаю, что камень any_of - единственное решение здесь? - person Donato; 04.06.2015
comment
В моем случае (rails 4.0.13) он удалял записи, найденные в первом предложении «где», и возвращал только те, которые были найдены во втором предложении. Обратите внимание, что у меня есть «объединение», и пункты отлично работают по отдельности. Думаю, мне нужно написать метод класса для суммирования идентификаторов из каждого поиска, а затем повторно запросить с помощью where(:id => id_set) - если/пока не будет способа суммировать наборы AR. - person JosephK; 31.01.2016
comment
Вы действительно должны использовать Article.where( "articles.title = ? OR articles.title = ?", "Rails 3", "Rails 4" ), чтобы избежать внедрения SQL. - person Joshua Pinter; 17.11.2019
comment
Вы не уязвимы для SQL-инъекций, если ваш запрос не содержит пользовательский ввод. Article.where("articles.title = '#{some_var}'") может быть уязвимым для атак путем внедрения кода SQL, а Article.where("articles.title = 'Rails 3' OR articles.title = 'Rails 4'") — нет. - person gregates; 19.11.2019

Теперь это работает в Rails 5:

Article.where(title: 'Rails 3').or(Article.where(title: 'Rails 4'))

Пример кода в исходном коде Rails.

person Fellow Stranger    schedule 05.03.2016
comment
Даже с этим изменением в Rails 5 я бы придерживался ответа @gregates и использовал этот синтаксис Article.where(title: ['Rails 3', 'Rails 4']). Это менее подробно и соответствует обычному использованию Article.where(id: [1, 2, 3, 4]) - person BigRon; 20.09.2016
comment
Это решение имеет то преимущество, что вы можете использовать разные столбцы в двух запросах. - person Eric Duminil; 10.11.2016
comment
Еще одним преимуществом является то, что он хорошо работает с переопределяющими методами, возвращающими запросы super.or(Article.where(title: 'Rails 4')). - person Subtletree; 06.11.2017

Самая распространенная альтернатива - это уже ответ @gregates

Недавно в источнике рельсов был запрос на извлечение

Добавить #any_of метод запроса к active_record, который добавляет функциональность к activerecord

участник уже создал драгоценный камень, если он не принят

его рельсы 3.2 и 4 совместимы

https://github.com/oelmekki/activerecord_any_of

Я еще не пробовал, но скоро хочу использовать, мне кажется, это хорошо.

person Pritesh Jain    schedule 19.06.2013

Я знаю, что это старый поток, но любой, кто ищет решение этой проблемы, может найти этот код полезным:

Article.where(title: ["Rails 3", "Rails 4"])

Возможно, это поможет вам заставить кого-то двигаться в правильном направлении, не рискуя внедрением sql.

person Rob Richey    schedule 13.03.2014
comment
Что это добавляет к (гораздо старому) принятому ответу? - person Brad Werth; 02.09.2014
comment
По сравнению с принятым ответом, я думаю, что это чище и легче читать. - person hellion; 05.10.2014
comment
Конечно, это работает, только если это один и тот же столбец. Если это разные столбцы, вам нужно использовать необработанный SQL для Rails 4.2 или младше и новый метод .or для Rails 5+. - person Joshua Pinter; 17.11.2019

Похоже, что основная ветка rails теперь поддерживает запросы OR. https://github.com/rails/rails/pull/16052

Я предполагаю, что это будет в рамках следующего основного выпуска.

person Arjan    schedule 02.02.2015
comment
Да, dhh сказал, что это будет в Rails 5: github.com/rails /rails/pull/16052#issuecomment-72718557 - person amoebe; 06.02.2015

Rails 5 будет его поддерживать, но вы можете использовать этот бэкпорт для Rails 4.2: https://github.com/Eric-Guo/where-or

person Nicolas Maloeuvre    schedule 21.10.2015

Вы можете использовать Squeel для более сложных запросов:

Article.where{(title == 'Rails 3') | (title == 'Rails 4')}

В результате получается следующий SQL-запрос:

SELECT `articles`.* FROM `articles` WHERE ((`articles`.`title` = 'Rails 3' OR `articles`.`title` = 'Rails 4'))
person Stefan    schedule 19.06.2013
comment
Да, я мог бы также использовать Arel. Но я ищу родное решение. - person Arjan; 20.06.2013