¿Cómo se realiza una orconsulta en Rails 5 ActiveRecord? Además, ¿es posible encadenar orcon whereconsultas ActiveRecord?
ruby-on-rails
ruby
activerecord
ruby-on-rails-5
rails-activerecord
KM Rakibul Islam
fuente
fuente

Respuestas:
La capacidad de encadenar
orcláusula junto conwherecláusula enActiveRecordconsulta 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
postconid1 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
ORconsulta. 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
ORfuncionalidad>= rails 4.2.3tambié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.4estado 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
.mergecomo 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
orcláusula conwhere. Por ejemplo.fuente