2011-09-04 22 views
0

MetaWhere我使用循環,if語句將條件組合到sql變量。MetaWhere到Squeel遷移

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

我怎樣才能使用Squeel

感謝您的任何幫助)

回答

1

我使用Arel解決了我的問題。 我認爲(我只是將MetaWhere代碼更改爲Arel),它與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%')" 

謝謝大家的幫助!

1

檢查「squeel」方法,在0.9.0新。它被添加到支持這種事情。它只是給你一個簡單的方法來編寫一個Squeel DSL塊,而不需要將它附加到「where」,「join」等。

你也可能想要考慮在模型的篩選器中封裝這個邏輯。

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'} 
+0

感謝您的幫助)我已經發現瞭解決方案(Arel)。但問題是關於「MetaWhere - > ** Squeel **」,所以你的答案是非常有用的。 – vany