Ruby on Rails 3 как сделать условие «ИЛИ» - PullRequest
50 голосов
/ 20 июля 2010

Мне нужен оператор SQL, который проверяет, выполняется ли одно условие:

SELECT * FROM my_table WHERE my_table.x=1 OR my_table.y=1

Я хочу сделать это способом «Rails 3».Я искал что-то вроде:

Account.where(:id => 1).or.where(:id => 2)

Я знаю, что всегда могу вернуться к sql или строке условий.Однако, по моему опыту, это часто приводит к хаосу при объединении областей.Каков наилучший способ сделать это?

Еще один связанный с этим вопрос, как можно описать отношения, которые зависят от условия ИЛИ.Единственный способ, который я нашел:

has_many :my_thing, :class_name => "MyTable",  :finder_sql => 'SELECT my_tables.* ' + 'FROM my_tables ' +
'WHERE my_tables.payer_id = #{id} OR my_tables.payee_id = #{id}'

Однако они снова ломаются при использовании в комбинациях.Есть ли лучший способ указать это?

Ответы [ 9 ]

114 голосов
/ 10 декабря 2012

Account.where(id: [1,2]) объяснение не требуется.

72 голосов
/ 29 апреля 2011

Это будет работать в Rails 5, см. rails master :

Post.where('id = 1').or(Post.where('id = 2'))
# => SELECT * FROM posts WHERE (id = 1) OR (id = 2)

Для Rails 3.0.4 +:

accounts = Account.arel_table
Account.where(accounts[:id].eq(1).or(accounts[:id].eq(2)))
16 голосов
/ 19 апреля 2012

Эти запросы не доступны для чтения.

Что не так со строкой SQL?Фактически, в руководствах по Rails этот способ представлен как первый способ задания условий в запросах: http://guides.rubyonrails.org/active_record_querying.html#array-conditions

Итак, я готов поспорить, что этот способ будет действовать как «путь Rails»:

Account.where("id = 1 OR id = 2")

По моему скромному мнению, оно короче и понятнее.

9 голосов
/ 20 июля 2010

К сожалению, .or еще не реализован (но когда это произойдет, это будет УДИВИТЕЛЬНО).

Так что вам придется сделать что-то вроде:

class Project < ActiveRecord::Base
  scope :sufficient_data, :conditions=>['ratio_story_completion != 0 OR ratio_differential != 0']
  scope :profitable, :conditions=>['profit > 0']

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

Project.sufficient_data.profitable
6 голосов
/ 20 июля 2010

Я бы пошел с предложением IN, например:

Account.where(["id in (?)", [1, 2]])
5 голосов
/ 10 июля 2012

Я использовал камень Squeel (https://github.com/ernie/squeel/) для выполнения запросов ИЛИ, и он прекрасно работает.

Позволяет написать запрос как Account.where{(id == 1) | (id == 2)}

.
4 голосов
/ 10 июля 2012

Вы можете определить Массив как значение в :conditions Хэш.

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

Account.all(:conditions => { :id => [1, 2] })

Протестировано с Rails 3.1.0

2 голосов
/ 09 мая 2016

Альтернативный синтаксис с использованием Hash

Account.where("id = :val1 OR id = :val2", val1: 1, val2: 2).

Это особенно полезно, когда значение сравнивается с несколькими столбцами. например:

User.where("first_name = :name OR last_name = :name", name: 'tom')
0 голосов
/ 14 января 2017

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

Account.where(id: 1).or(id: 2)

(Это также работает в Rails 4 и 5).

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