Meta Dove migrazione Squeal
-
22-10-2019 - |
Domanda
MetaWhere Ho condizioni combinate a variabile sql utilizzando i cicli, se else.
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, .................................. >
Come posso fare lo stesso utilizzando Squeel ?
Grazie per qualsiasi aiuto)
Soluzione 2
Ho risolto il mio problema utilizzando Arel . Credo che (Ho appena cambiato il codice MetaWhere a Arel) che è proprio la stessa 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%')"
Grazie a tutti per l'aiuto!
Altri suggerimenti
controllare il metodo di "squeel", di nuovo in 0.9.0. E 'stato aggiunto a sostenere esattamente questo genere di cose. E 'appena ti dà un modo semplice per scrivere un blocco di Squeel DSL senza in realtà allegandolo a un "dove", "join", ecc.
Si potrebbe anche prendere in considerazione l'incapsulamento questa logica in un setaccio per il modello.
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'}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow