【问题标题】:MetaWhere to Squeel migrationMetaWhere to Squeel 迁移
【发布时间】:2011-09-04 22:02:25
【问题描述】:

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 做同样的事情?

感谢您的帮助)

【问题讨论】:

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


    【解决方案1】:

    查看 0.9.0 中新增的“squeel”方法。添加它是为了支持这种事情。它只是为您提供了一种编写 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'}
    

    【讨论】:

    • 感谢您的帮助)我已经找到了解决方案(Arel)。但问题是关于“MetaWhere -> Squeel”,所以你的回答非常有用。
    【解决方案2】:

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

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-07
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多