rails left inner active ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord ruby-on-rails-5

ruby on rails - left - ActiveRecord O consulta Notación de hash



rails join table (2)

Sé que hay 3 notaciones principales para proporcionar argumentos al método where ActiveRecord:

  1. Cuerda pura
  2. Formación
  3. Picadillo

Especificar and para el método where es sencillo:

# 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})

Especificando or para esto mismo where método me está confundiendo para la sintaxis hash. ¿Es posible?

# 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})


Como dice potashin, puede usar otros complementos de terceros que implementan esta función. Tengo mucho tiempo usando Squeel y funciona bastante bien para esto y para muchas más funciones, como subconsultas o combinaciones complejas.

Esa consulta usando squeel:

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


Hay 5 opciones que podrían considerarse como implementaciones de «notación de hash» (las dos últimas son un poco hash- ish ):

  1. Con Ruby on Rails 5 puedes hacer el siguiente encadenamiento usando ActiveRecord::Relation#or método:

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

  2. Utilice where_values junto con reduce . El método sin ámbito es necesario solo para Rails 4.1+ para garantizar que default_scope no esté incluido en where_values . De lo contrario, los predicados de default_scope y where se encadenarían con el operador or :

    Person.where( Person.unscoped.where(name: [''Neil''], age: [27]).where_values.reduce(:or) )

  3. Instale complementos de terceros que implementen estas características o similares, por ejemplo:

    • Where Or (backport de Ruby on Rails 5 .or característica mencionada anteriormente)

    • 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. Utiliza Arel :

    Person.where( Person.arel_table[:name].eq(''Neil'').or( Person.arel_table[:age].eq(27) ) )

  5. Use declaraciones preparadas con parámetros con nombre:

    Person.where(''name = :name or age = :age'', name: ''Neil'', age: 27)