元在哪里尖叫迁移

时间:2011-09-04 22:02:25

标签: ruby-on-rails-3.1 meta-where squeel

MetaWhere中,我使用循环,if else语句将条件组合到sql变量。

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完成同样的工作?

感谢您的帮助)

2 个答案:

答案 0 :(得分:1)

查看“squeel”方法,0.9.0中的新方法。它被添加以支持这种事情。它只是为您提供了一种简单的方法来编写Squeel DSL块,而无需将其实际附加到“where”,“join”等。

您也可以考虑将此逻辑封装在模型的sifter中。

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

答案 1 :(得分: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%')"

感谢大家的帮助!