ActiveRecord OR查询哈希表示法

Nei*_*eil 72 activerecord ruby-on-rails ruby-on-rails-4 rails-activerecord ruby-on-rails-5

我知道有三个主要的符号为whereActiveRecord方法提供参数:

  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})
Run Code Online (Sandbox Code Playgroud)

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})
Run Code Online (Sandbox Code Playgroud)

pot*_*hin 141

有可能被视为«哈希符号»(最后两个还挺散列实现5个选项ISH):

  1. 使用Ruby on Rails 5,您可以使用以下ActiveRecord::Relation#or方法进行链接:

    Person.where(name: 'Neil').or(Person.where(age: 27))
    
    Run Code Online (Sandbox Code Playgroud)
  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) 
    )
    
    Run Code Online (Sandbox Code Playgroud)
  3. 安装实现这些或类似功能的第三方插件,例如:

  4. 使用Arel:

    Person.where( 
      Person.arel_table[:name].eq('Neil').or(
        Person.arel_table[:age].eq(27)
      ) 
    )
    
    Run Code Online (Sandbox Code Playgroud)
  5. 使用带有命名参数的预准备语句

    Person.where('name = :name or age = :age', name: 'Neil', age: 27)
    
    Run Code Online (Sandbox Code Playgroud)