Ruby on Rails 3 как сделать условие "ИЛИ"
Мне нужен оператор 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}'
Однако они снова ломаются при использовании в комбинациях. Есть ли лучший способ указать это?
Ответы
Ответ 1
К сожалению,.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
Ответ 2
Account.where(id: [1,2])
никаких объяснений не требуется.
Ответ 3
Это будет работать в 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)))
Ответ 4
Те запросы isl не читаются для меня.
Что случилось с строкой SQL? На самом деле, направляющие Rails раскрывают этот способ как первый способ создания условий в запросах: http://guides.rubyonrails.org/active_record_querying.html#array-conditions
Итак, я держал пари для этого, чтобы сделать это как "Rails way":
Account.where("id = 1 OR id = 2")
По моему скромному мнению, оно короче и яснее.
Ответ 5
Я бы пошел с предложением IN
, например:
Account.where(["id in (?)", [1, 2]])
Ответ 6
Я использовал камень Squeel (https://github.com/ernie/squeel/), чтобы делать OR запросы, и он прекрасно работает.
Он позволяет вам писать свой запрос как Account.where{(id == 1) | (id == 2)}
Ответ 7
Вы можете определить Array как значение в :conditions
Hash.
Итак, вы можете сделать, например:
Account.all(:conditions => { :id => [1, 2] })
Протестировано с Rails 3.1.0
Ответ 8
Альтернативный синтаксис с использованием Hash
Account.where("id = :val1 OR id = :val2", val1: 1, val2: 2).
Это особенно полезно, когда значение сравнивается с несколькими столбцами. например:
User.where("first_name = :name OR last_name = :name", name: 'tom')
Ответ 9
С rails_or вы можете сделать это как:
Account.where(id: 1).or(id: 2)
(Он также работает в Rails 4 и 5.)