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)

¿Fue útil?

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
scroll top