ActiveRecord或查询散列符号

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

  1. 纯string
  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相同的方法是为我的哈希语法。 可能吗?

 # 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个选项可以被认为是“哈希符号”(Hash notation)的实现(最后两个是有点哈希):

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

     Person.where(name: 'Neil').or(Person.where(age: 27)) 
  2. where_valueswhere_values一起使用。 只有Rails 4.1+才能使用where_values方法来确保default_scope不包含在where_values 。 否则,来自两个default_scope谓词以及与or运算符链接的where

     Person.where( Person.unscoped.where(name: ['Neil'], age: [27]).where_values.reduce(:or) ) 
  3. 安装实现这些或类似function的第三方插件,例如:

    • 在哪里 (上面提到的Ruby on Rails 5 .orfunction的backport)

    • Squeel

       Person.where{(name == 'Neil') | (age == 27)} 
    • RailsOr

       Person.where(name: 'Neil').or(age: 27) 
    • ActiverecordAnyOf

       Person.where.anyof(name: 'Neil', age: 27) 
    • SmartTuple

       Person.where( (SmartTuple.new(' or ') << {name: 'Neil', age: 27}).compile ) 
  4. 使用Arel :

     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) 

正如Potashin所说,您可以使用其他第三方插件来实现此function。 我有很长一段时间使用Squeel和这个和更复杂的子查询或联接function很好。

该查询使用squeel:

 @people= Person.where{(name == 'Neil') | (age = 27)}