Frage

Im Metaker Ich habe die Bedingungen für die SQL -Variable unter Verwendung von Schleifen kombiniert, wenn sonst Anweisungen.

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

Wie kann ich das Gleiche tun, indem ich mit Squeel?

Danke für jede Hilfe)

War es hilfreich?

Lösung 2

Ich habe mein Problem mit der Verwendung gelöst Arel. Ich finde (Ich habe gerade Metawhere -Code in Arel geändert), dass er genauso ist wie Metaker.

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%')"

Vielen Dank an alle für Hilfe!

Andere Tipps

Schauen Sie sich die "Squeel" -Methode an, neu in 0.9.0. Es wurde hinzugefügt, um genau so etwas zu unterstützen. Es gibt Ihnen nur eine einfache Möglichkeit, einen Block Squeel DSL zu schreiben, ohne ihn tatsächlich an ein "Wo", "Join" usw. anzubringen.

Möglicherweise möchten Sie auch in Betracht ziehen, diese Logik in einem Sifter für Ihr Modell zu verringern.

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'}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top