74

whereActiveRecord メソッドに引数を提供するための主な表記法が 3 つあります。

  1. ピュアストリング
  2. 配列
  3. ハッシュ

メソッドの指定andwhere簡単です。

# Pure String notation
Person.where("name = 'Neil' AND age = 27")

# Array notation
Person.where(["name = ? AND age = ?", 'Neil', 27])

# Hash notation
Person.where({name: "Neil", age: 27})

orこの同じメソッドを指定するwhereと、ハッシュ構文がわかりにくくなります。出来ますか?

# Pure String notation
Person.where("name = 'Neil' OR age = 27")

# Array notation
Person.where(["name = ? OR age = ?", 'Neil', 27])

# Hash notation DOESN'T WORK
Person.where({name: "Neil" OR age: 27})
4

2 に答える 2

144

«Hash notation» の実装と考えられる 5 つのオプションがあります (最後の 2 つはちょっとハッシュっぽいです):

  1. ActiveRecord::Relation#orRuby on Rails 5 では、メソッドを使用して次のチェーンを実行できます。

    Person.where(name: 'Neil').or(Person.where(age: 27))
    
  2. where_valuesと併用してくださいreduce。このunscopedメソッドは、Rails 4.1+default_scopeが に含まれていないことを確認するためにのみ必要where_valuesです。default_scopeそれ以外の場合は、両方からの述語であり、演算子whereでチェーンされます。or

    Person.where( 
      Person.unscoped.where(name: ['Neil'], age: [27]).where_values.reduce(:or) 
    )
    
  3. これらまたは同様の機能を実装するサードパーティのプラグインをインストールします。例:

  4. アレルを使用:

    Person.where( 
      Person.arel_table[:name].eq('Neil').or(
        Person.arel_table[:age].eq(27)
      ) 
    )
    
  5. 名前付きパラメーターで準備済みステートメントを使用します。

    Person.where('name = :name or age = :age', name: 'Neil', age: 27)
    
于 2015-06-28T04:18:00.563 に答える
1

potashin が言うように、この機能を実装する別のサードパーティ製プラグインを使用できます。私は長い間Squeelを使用してきましたが、これに加えて、複雑なサブクエリや結合などの多くの機能でうまく機能します。

squeel を使用したそのクエリ:

@people= Person.where{(name == 'Neil') | (age = 27)}
于 2016-01-19T15:33:22.050 に答える