Metawhere to squeel migración
-
22-10-2019 - |
Pregunta
En Metawhere Combiné condiciones a la variable SQL usando bucles, si más se declaran.
sql = {}
email_starts_with = "vany%"
sql["growth"] = 0..200
sql = sql & (:rating > 50)
sql = sql & (:email =~ email_starts_with)
.....
.....
User.where(sql).to_sql
=> "SELECT \"users\".* FROM \"users\" WHERE \"users\".\"growth\" BETWEEN 0 AND 200 AND \"users\".\"rating\" > 50 AND \"users\".\"email\" ILIKE 'vany%'"
user = User.where(sql).first
=> #<User id: 1, .................................. >
¿Cómo puedo hacer lo mismo usando Chillar?
Gracias por cualquier ayuda)
Solución 2
Resolví mi problema usando Arel. pienso (Acabo de cambiar el código Metawhere a Arel) que es el mismo que Metawhere.
t = User.arel_table
email_starts_with = "vany%"
sql = t[:rating].gt(50)
sql = t[:growth].in(0..200)
sql = sql.and(t[:email].matches(email_starts_with))
User.where(sql).to_sql
=> "SELECT \"users\".* FROM \"users\" WHERE (\"users\".\"growth\" BETWEEN 0 AND 200 AND \"users\".\"email\" ILIKE 'vany%')"
¡Gracias a todos por su ayuda!
Otros consejos
Echa un vistazo al método "squeel", nuevo en 0.9.0. Se agregó para apoyar exactamente este tipo de cosas. Simplemente le da una manera fácil de escribir un bloque de squeel dsl sin adjuntarlo a un "dónde", "unirse", etc.
También es posible que desee considerar encapsular esta lógica en un tamiz para su modelo.
class User < ActiveRecord::Base
sifter :my_sifter do |growth_range, min_rating, email_start|
growth.in(growth_range) & rating.gt(min_rating) & email.matches("#{email_start}%")
end
end
User.where{sift :my_sifter, 0..200, 50, 'vany'}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow