ActiveRecord或查询哈希符号


73

我知道有3种主要符号为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})

指定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})

Answers:


142

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

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

    Person.where(name: 'Neil').or(Person.where(age: 27))
    
  2. 使用where_values一起reduce仅对于Rails 4.1+,该unscoped方法才是必需的以确保default_scope未包含在中where_values。否则,从两个谓词default_scopewhere将与被链接or操作:

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

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

    • que

      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)
    

1
这是一个完整的答案。的arel回答是特别好,因为这是何等的被添加到该导轨5,据我所知。
汤姆·哈里森

如果您迫不及待要使用Rails 5,可以使用此功能的向后移植到Rails 4.2。很好地打包为“ where-or” gem github.com/Eric-Guo/where-or
Rob

如果您的项目仍在Rails 3+中,则可以尝试使用rails_or gem:github.com/khiav223577/rails_or
khiav reoy

1

正如potashin所说,您可以使用实现此功能的另一个第三方插件。我使用Squeel的时间很长,为此和其他功能(例如复杂的子查询或联接)工作得很好。

该查询使用squeel:

@people= Person.where{(name == 'Neil') | (age = 27)}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.