web-dev-qa-db-ja.com

Ruby on Rails 3「OR」条件の作り方

1つの条件が満たされているかどうかを確認する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または条件文字列にフォールバックできることを知っています。しかし、私の経験では、これはスコープを組み合わせるときにしばしば混乱をもたらします。これを行う最良の方法は何ですか?

もう1つの関連する質問は、OR条件に依存する関係をどのように説明できるかです。

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}'

ただし、これらを組み合わせて使用​​すると再び壊れます。 ISこれを指定するより良い方法はありますか?

50
hjuskewycz

悲しいことに、.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
9
Jesse Wolgamott

Account.where(id: [1,2])説明は不要です。

114
Mike Campbell

これは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)))
72
weston

これらのarelクエリは私には判読できません。

SQL文字列の何が問題になっていますか?実際、Railsガイドは、クエリで条件を作成する最初の方法としてこの方法を公開しています。 http://guides.rubyonrails.org/active_record_querying.html#array-conditions

だから、私はこの方法で「レールの方法」としてそれをすることに賭けます:

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

私の謙虚な意見では、それは短くて明確です。

16
David Morales

IN句を使用します。例:

Account.where(["id in (?)", [1, 2]])
6
jpemberthy

Squeel gem( https://github.com/ernie/squeel/ )を使用してORクエリを実行しました。

クエリをAccount.where{(id == 1) | (id == 2)}として記述できます

5
brad

:conditionsハッシュの値として配列を定義できます。

たとえば、次のことができます。

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

Rails 3.1.0でテスト済み

4
TehQuila

ハッシュを使用した代替構文

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

これは、値が複数の列と比較される場合に特に役立ちます。例えば:

User.where("first_name = :name OR last_name = :name", name: 'tom')
2
Santhosh

Rails_or を使用すると、次のようにできます。

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

(Rails 4と5でも動作します。)

0
khiav reoy