Estoy usando Rails3, ActiveRecord
Solo me pregunto cómo puedo encadenar los ámbitos con declaraciones OR en lugar de AND.
p.ej
Person.where(:name => "John").where(:lastname => "Smith")
Eso normalmente regresa:
name = 'John' AND lastname = 'Smith'
pero me gustaría:
`name = 'John' OR lastname = 'Smith'
ruby-on-rails
ruby-on-rails-3
activerecord
rails-activerecord
usuario410715
fuente
fuente
Respuestas:
Tu harías
En este momento, no hay ningún otro soporte O por la nueva sintaxis AR3 (es decir, sin usar alguna gema de terceros).
fuente
.or
incorporado .De acuerdo con esta solicitud de extracción , Rails 5 ahora admite la siguiente sintaxis para encadenar consultas:
También hay un backport de la funcionalidad en Rails 4.2 a través de esta gema.
fuente
Use ARel
fuente
Simplemente publique la sintaxis de la matriz para la misma columna O consultas para ayudar a mirar.
fuente
Actualización para Rails4
no requiere gemas de terceros
Vieja respuesta
no requiere gemas de terceros
fuente
or
operadores de interpolación u otros dentro de un bloque de texto, ninguno de los cuales se refleja en el código de OP....where_values.join(' OR ')
en mi caso.tap {|sc| sc.bind_values = [a, b].map(&:bind_values) }
parte si sus ámbitos no tienen ninguna variable que deba vincularse.También puedes usar MetaWhere gema para no mezclar su código con material SQL:
fuente
En caso de que alguien esté buscando una respuesta actualizada a esta, parece que hay una solicitud de extracción existente para obtener esto en Rails: https://github.com/rails/rails/pull/9052 .
Gracias al parche de mono de @ j-mcnally para ActiveRecord ( https://gist.github.com/j-mcnally/250eaaceef234dd8971b ) puede hacer lo siguiente:
Aún más valiosa es la capacidad de encadenar ámbitos con
OR
:Luego puede encontrar todas las personas con nombre o apellido o cuyo padre con apellido
No es el mejor ejemplo para el uso de esto, pero solo trato de encajar con la pregunta.
fuente
.or
cadena. Pude usar el parche de mono que mencioné en Rails> = 3.2; sin embargo, es posible que desee esperar a que Rails 5 introduzca cualquier cambio de larga data en su código.Para mí (Rails 4.2.5) solo funciona así:
fuente
Este sería un buen candidato para MetaWhere si está utilizando Rails 3.0+, pero no funciona en Rails 3.1. Es posible que desee probar chirrido en su lugar. Está hecho por el mismo autor. Así es como realizarías una cadena basada en OR:
Puedes mezclar y combinar AND / OR, entre muchas otras cosas increíbles .
fuente
Una versión actualizada de Rails / ActiveRecord puede admitir esta sintaxis de forma nativa. Se vería similar a:
Como se señaló en esta solicitud de extracción https://github.com/rails/rails/pull/9052
Por ahora, simplemente seguir con lo siguiente funciona muy bien:
fuente
Foo.where(foo: 'bar1').or.where(bar: 'bar2')
No funciona. Debería ser Foo.where (foo: 'bar1'). Or.where (Foo.where (bar: 'bar2'))Rieles 4 + Alcance + Arel
Traté de encadenar ámbitos con nombre con. O sin suerte, pero esto funcionó para encontrar algo con esos conjuntos booleanos. Genera SQL como
fuente
Carriles 4
fuente
Si está buscando proporcionar un alcance (en lugar de trabajar explícitamente en todo el conjunto de datos), esto es lo que debe hacer con Rails 5:
O:
fuente
Si no puede escribir la cláusula where manualmente para incluir la declaración "o" (es decir, desea combinar dos ámbitos), puede usar union:
(fuente: ActiveRecord Query Union )
Esto devolverá todos los registros que coincidan con cualquiera de las consultas. Sin embargo, esto devuelve una matriz, no un arel. Si realmente desea devolver un arel, consulte esta esencia: https://gist.github.com/j-mcnally/250eaaceef234dd8971b .
Esto hará el trabajo, siempre y cuando no le importe los rieles de parches de mono.
fuente
También vea estas preguntas relacionadas: aquí , aquí y aquí
Para los rieles 4, según este artículo y esta respuesta original
Tenga en cuenta la precaución del artículo al final:
fuente
Esta es una forma muy conveniente y funciona bien en Rails 5:
fuente
la
squeel
gema proporciona una manera increíblemente fácil de lograr esto (antes de esto, usé algo como el método de @ coloradoblue):fuente
Entonces, la respuesta a la pregunta original, ¿puede unir ámbitos con 'o' en lugar de 'y' parece ser "no, no puede". Pero puede codificar manualmente un alcance o consulta completamente diferente que haga el trabajo, o usar un marco diferente de ActiveRecord, por ejemplo, MetaWhere o Squeel. No es útil en mi caso
Estoy 'o' creando un alcance generado por pg_search, que hace un poco más que seleccionar, incluye el orden de ASC, lo que hace un desastre de una unión limpia. Quiero 'o' con un alcance artesanal que hace cosas que no puedo hacer en pg_search. Así que tuve que hacerlo así.
Es decir, convertir los ámbitos en sql, poner corchetes alrededor de cada uno, unirlos y luego find_by_sql utilizando el sql generado. Es un poco basura, pero funciona.
No, no me digas que puedo usar "contra: [: nombre,: código]" en pg_search, me gustaría hacerlo así, pero el campo 'nombre' es un hstore, que pg_search no puede manejar todavía. Por lo tanto, el alcance por nombre debe ser diseñado a mano y luego unido con el alcance pg_search.
fuente
fuente