74

where我知道为ActiveRecord 方法提供参数有 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

有 5 个选项可以被视为“哈希表示法”的实现(最后两个有点哈希

  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_scopewhereor运算符链接:

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

    • Where Or (上述 Ruby on Rails 5.or功能的反向移植)

    • 斯奎尔

      Person.where{(name == 'Neil') | (age == 27)} 
      
    • 导轨或

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

      Person.where.anyof(name: 'Neil', age: 27)
      
    • 智能元组

      Person.where(
        (SmartTuple.new(' or ') << {name: 'Neil', age: 27}).compile
      )
      
  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 回答