1. ホーム
  2. ruby-on-rails

ActiveRecord OR クエリ ハッシュ記法

2023-12-18 23:10:33

質問

への引数の指定には、主に3つの表記があることは知っています。 where ActiveRecordのメソッドに引数を与えるための3つの主な表記法を知っています。

  1. 純粋な文字列
  2. 配列
  3. ハッシュ

指定方法 and を指定します。 where メソッドは簡単です。

# 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})

どのように解決するのですか?

ハッシュ記法」の実装として考えられる選択肢は5つあります(最後の2つはなんとなくハッシュ記法です)。 ish ):

  1. Ruby on Rails 5では、次のような連鎖が可能です。 ActiveRecord::Relation#or メソッドを使うことで、以下のような連鎖ができます。

    Person.where(name: 'Neil').or(Person.where(age: 27))
    
    
  2. 使用方法 where_values と共に reduce . は unscoped メソッドが必要です Rails 4.1+のみ を確実にするために default_scope が含まれないように where_values . そうでなければ、両者の述語は default_scopewhere は連鎖して 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)