Question

Dans MetaWhere I combinées à la variable SQL en utilisant des boucles, si les déclarations d'autre.

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, .................................. >

Comment puis-je faire la même chose en utilisant Squeel ?

Merci pour toute aide)

Était-ce utile?

La solution 2

Je résolus mon problème en utilisant Arel . Je pense (Je viens de modifier le code MetaWhere à Arel) qu'il est la même chose 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%')"

Merci tout le monde pour l'aide!

Autres conseils

vérifier la méthode "Squeel", nouvelle en 0.9.0. Il a été ajouté pour soutenir exactement ce genre de chose. Il vous donne juste un moyen facile d'écrire un bloc de DSL Squeel sans réellement attacher à un « où », « rejoindre », etc.

Vous pouvez également envisager d'encapsuler cette logique dans un tamiseur pour votre modèle.

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'}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top