ActiveRecord OR查询哈希表示法

时间:2015-06-28 03:58:31

标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord ruby-on-rails-5

我知道有3个主要表示法为where ActiveRecord方法提供参数:

  1. Pure String
  2. 阵列
  3. 哈希
  4. 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})
    

2 个答案:

答案 0 :(得分:140)

有5个选项可以被视为«Hash符号»的实现(后两个是有点哈希 - ish ):

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

    Person.where(name: 'Neil').or(Person.where(age: 27))
    
  2. where_valuesreduce一起使用。 unscoped方法必须only for Rails 4.1+,以确保default_scope中不包含where_values。否则,来自default_scopewhere的谓词将与or运算符链接:

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

    • Where Or (上面提到的Ruby on Rails 5 .or功能的后端)

    • 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)
    

答案 1 :(得分:1)

正如potashin所说,您可以使用其他实现此功能的第三方插件。我有很长一段时间使用Squeel并且非常适合这个以及更复杂的子查询或连接等功能。

使用squeel的查询:

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