Metawhere到Squeel迁移
-
22-10-2019 - |
题
在 METAWHERE 如果其他语句,我将条件结合到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
我解决了我的问题 阿雷尔. 我认为 (我只是将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%')"
感谢大家的帮助!
其他提示
查看“ 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'}
不隶属于 StackOverflow