ActiveRecord ИЛИ запрос - PullRequest
       74

ActiveRecord ИЛИ запрос

174 голосов
/ 04 сентября 2010

Как вы делаете запрос OR в Rails 3 ActiveRecord. Все примеры, которые я нахожу, имеют только запросы AND.

Редактировать: ИЛИ метод доступен начиная с Rails 5. См. ActiveRecord :: QueryMethods

Ответы [ 13 ]

199 голосов
/ 01 марта 2012

Если вы хотите использовать оператор OR для значения одного столбца, вы можете передать массив в .where, и ActiveRecord будет использовать IN(value,other_value):

Model.where(:column => ["value", "other_value"]

:

Это должно обеспечить эквивалент OR для одного столбца

147 голосов
/ 15 февраля 2011

в Rails 3, должно быть

Model.where("column = ? or other_column = ?", value, other_value)

Это также включает в себя raw sql, но я не думаю, что в ActiveRecord есть способ выполнить операцию ИЛИ. Ваш вопрос не является вопросом новичка.

108 голосов
/ 04 сентября 2010

Использование ARel

t = Post.arel_table

results = Post.where(
  t[:author].eq("Someone").
  or(t[:title].matches("%something%"))
)

Полученный SQL:

ree-1.8.7-2010.02 > puts Post.where(t[:author].eq("Someone").or(t[:title].matches("%something%"))).to_sql
SELECT     "posts".* FROM       "posts"  WHERE     (("posts"."author" = 'Someone' OR "posts"."title" LIKE '%something%'))
55 голосов
/ 18 декабря 2014

Обновленная версия Rails / ActiveRecord может изначально поддерживать этот синтаксис.Это выглядело бы примерно так:

Foo.where(foo: 'bar').or.where(bar: 'bar')

Как отмечалось в этом запросе на получение https://github.com/rails/rails/pull/9052

На данный момент, просто придерживаться следующих работ замечательно:

Foo.where('foo= ? OR bar= ?', 'bar', 'bar')

Обновление: Согласно https://github.com/rails/rails/pull/16052 функция or будет доступна в Rails 5

Обновление: Функция была объединена с веткой Rails 5

35 голосов
/ 18 июня 2015

Rails недавно добавил это в ActiveRecord. Похоже, что это будет выпущено в Rails 5. Готовы освоить уже:

https://github.com/rails/rails/commit/9e42cf019f2417473e7dcbfcb885709fa2709f89

Post.where(column: 'something').or(Post.where(other: 'else'))

# => SELECT * FROM posts WHERE (column = 'something') OR (other = 'else)
18 голосов
/ 09 мая 2016

Rails 5 поставляется с or методом. (л чернила к документации )

Этот метод принимает объект ActiveRecord::Relation. например:

User.where(first_name: 'James').or(User.where(last_name: 'Scott'))
14 голосов
/ 08 ноября 2013

Если вы хотите использовать массивы в качестве аргументов, следующий код работает в Rails 4:

query = Order.where(uuid: uuids, id: ids)
Order.where(query.where_values.map(&:to_sql).join(" OR "))
#=> Order Load (0.7ms)  SELECT "orders".* FROM "orders" WHERE ("orders"."uuid" IN ('5459eed8350e1b472bfee48375034103', '21313213jkads', '43ujrefdk2384us') OR "orders"."id" IN (2, 3, 4))

Дополнительная информация: ИЛИ запрашивает массивы в качестве аргументов в Rails 4 .

7 голосов
/ 15 февраля 2011

Плагин MetaWhere совершенно потрясающий.

Легко смешивайте «И» и «И», объединяйте условия в любой ассоциации и даже указывайте ВНЕШНИЕ СОЕДИНЕНИЯ!

Post.where({sharing_level: Post::Sharing[:everyone]} | ({sharing_level: Post::Sharing[:friends]} & {user: {followers: current_user} }).joins(:user.outer => :followers.outer}
6 голосов
/ 04 сентября 2010

Просто добавьте ИЛИ в условия

Model.find(:all, :conditions => ["column = ? OR other_column = ?",value, other_value])
3 голосов
/ 29 декабря 2016

Вы можете сделать это следующим образом:

Person.where("name = ? OR age = ?", 'Pearl', 24)

или более элегантно, установить rails_or gem и сделать это так:

Person.where(:name => 'Pearl').or(:age => 24)
...