¿Cómo se realiza una or
consulta en Rails 5 ActiveRecord? Además, ¿es posible encadenar or
con where
consultas ActiveRecord?
ruby-on-rails
ruby
activerecord
ruby-on-rails-5
rails-activerecord
KM Rakibul Islam
fuente
fuente
Respuestas:
La capacidad de encadenar
or
cláusula junto conwhere
cláusula enActiveRecord
consulta estará disponible en Rails 5 . Consulte la discusión relacionada y la solicitud de extracción .Por lo tanto, podrá hacer las siguientes cosas en Rails 5 :
Para obtener un
post
conid
1 o 2:Algunos otros ejemplos:
(A && B) || C:
(A || B) && C:
fuente
Post.where(a).or(Post.where(b)).where(Post.where(c).or(Post.where(d)))
esto debe crear (a || b) && (c || d)ArgumentError: Unsupported argument type: #<MyModel::ActiveRecord_Relation:0x00007f8edbc075a8> (MyModel::ActiveRecord_Relation)
No necesitamos esperar a que los rieles 5 utilicen esta
OR
consulta. También podemos usarlo conrails 4.2.3
. Hay un puerto trasero aquí .Gracias a Eric-Guo por gem where-or , ahora podemos agregar esta
OR
funcionalidad>= rails 4.2.3
también usando esta gema.fuente
(Solo una adición a la respuesta de KM Rakibul Islam).
Al usar ámbitos, el código puede volverse más bonito (dependiendo de los ojos que miran):
fuente
Necesitaba hacer un
(A && B) || (C && D) || (E && F)
Pero en el
5.1.4
estado actual de Rails , esto es demasiado complicado de lograr con la cadena o de Arel. Pero todavía quería usar Rails para generar la mayor cantidad posible de consultas.Así que hice un pequeño truco:
En mi modelo creé un método privado llamado
sql_where
:A continuación, en mi alcance, creé una matriz para contener los OR
Que producirá el resultado de la consulta se esperaba:
SELECT * FROM `models` WHERE ((A AND B) OR (C AND D) OR (E AND F))
.Y ahora puedo combinar esto fácilmente con otros alcances, etc. sin ningún quirófano incorrecto.
La belleza es que mi sql_where toma argumentos normales de cláusula where:
sql_where(name: 'John', role: 'admin')
generará(name = 'John' AND role = 'admin')
.fuente
.merge
como equivalente de && y construir un árbol adecuado para capturar sus parens. Algo como ...(scopeA.merge(scopeB)).or(scopeC.merge(scopeD)).or(scopeE.merge(scopeF))
, suponiendo que cada uno de los ámbitos se parezca aModel.where(...)
Rails 5 tiene capacidad para
or
cláusula conwhere
. Por ejemplo.fuente