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:
- Cuerda pura
- Formación
- 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 ):
-
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))
-
Utilice
where_values
junto conreduce
. El método sin ámbito es necesario solo para Rails 4.1+ para garantizar quedefault_scope
no esté incluido enwhere_values
. De lo contrario, los predicados dedefault_scope
ywhere
se encadenarían con el operadoror
:Person.where( Person.unscoped.where(name: [''Neil''], age: [27]).where_values.reduce(:or) )
-
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) -
Person.where{(name == ''Neil'') | (age == 27)}
-
Person.where(name: ''Neil'').or(age: 27)
-
Person.where.anyof(name: ''Neil'', age: 27)
-
Person.where( (SmartTuple.new('' or '') << {name: ''Neil'', age: 27}).compile )
-
-
Utiliza Arel :
Person.where( Person.arel_table[:name].eq(''Neil'').or( Person.arel_table[:age].eq(27) ) )
-
Use declaraciones preparadas con parámetros con nombre:
Person.where(''name = :name or age = :age'', name: ''Neil'', age: 27)