2013-06-19 3 views
55

Итак, в Rails 4 добавлена ​​длинная желаемая функция для использования not запросов.Есть ли у Rails 4 поддержка OR запросов

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

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

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

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

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

+0

Если вам нравится синтаксис 'Article.where (title: 'Rails 3'). Или (title: 'Rails 4')', вы можете использовать [rails_or] (https://github.com/khiav223577/rails_or). –

ответ

77

Article.where(title: ['Rails 3', 'Rails 4']) как это сделать в Active Record.

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

Таким образом, вы также можете сделать:

Article.where("articles.title = 'Rails 3' OR articles.title = 'Rails 4'") 
+0

Правда в этом случае. Но это не сработает для более сложных условий. – Arjan

+1

Вот чего я боялся. Я знаю, что вы можете сделать это с произвольным sql. Но это именно то, чего я пытался избежать. Я надеялся, что, поскольку они добавили '' '' 'запросы, они будут поддерживать' или 'запросы, а также. – Arjan

+0

Очевидно, я не могу говорить о будущих планах основной команды рельсов! Вы можете попробовать открыть проблему в репозитории github. – gregates

12

Наиболее распространенной альтернативой уже ответить на @gregates

запрос В последнее время тянуть в рельсах Source

Add #any_of query method to active_record который добавляет или функциональность to activerecord

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

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

https://github.com/oelmekki/activerecord_any_of

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

1

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

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

Это приводит следующий запрос SQL:

SELECT `articles`.* FROM `articles` WHERE ((`articles`.`title` = 'Rails 3' OR `articles`.`title` = 'Rails 4')) 
+3

Да, я мог бы использовать [Arel] (https://github.com/rails/arel). Но я ищу собственное решение. – Arjan

3

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

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

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

+0

Что это добавляет к принятому (гораздо более старшему) ответу? –

+0

Кроме того, название модели должно быть уникальным ... –

+0

По сравнению с принятым ответом, я думаю, что это чище и легче читать. – hellion

4

Кажется, что ветвь master rails теперь поддерживает OR запросов. https://github.com/rails/rails/pull/16052

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

+0

Yup, dhh сказал, что у нас это будет в Rails 5: https://github.com/rails/rails/pull/16052#issuecomment-72718557 – amoebe

29

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

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

Code example in Rails's source.

+2

Даже с этим изменением в Rails 5 я бы придерживался ответа @gregates и используйте этот синтаксис 'Article.where (title: ['Rails 3', 'Rails 4'])'. Это меньше подробностей и соответствует общему использованию 'Article.where (id: [1, 2, 3, 4])' – BigRon

+7

. Это решение имеет то преимущество, что вы можете использовать разные столбцы в двух запросах. –

+0

Еще одно преимущество - это хорошо работает с переопределяющими методами, которые возвращают запросы 'super.or (Article.where (title: 'Rails 4'))' – Subtletree

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