情景:
产品以用户指定的货币显示,而每种产品都有自己的原始货币(可能与用户指定的货币相同,可以是任何其他货币)
用户希望以用户指定的货币搜索具有特定价格范围(10 - 100)的产品(假设为美元)
我正在使用postgres和Rails。每种产品都有原始货币的price_amount和货币。
问题 由于每种产品都可以是任何货币,我需要将所有产品标准化为用户指定的货币,这样我才能看到哪种产品在范围内。
我有每对支持货币的汇率。但是查询真的很复杂,所以我想知道是否有更高效的东西?
currencies.map do |currency|
rate = ex_rate(user_specific_currency, currency)
query = [query , "products.price * #{rate} <= user_max AND products.price * #{rate} >= user_min AND products.currency = '#{currency}'"].join(" OR ")
end
Product.where(query)
答案 0 :(得分:2)
您可以使用SQL CASE:
SELECT price, currency,
CASE WHEN currency='USD' THEN price * 1
WHEN currency='RUB' THEN price * 65
ELSE price
END as final_price
FROM products
WHERE final_price BETWEEN 10 AND 100
CASE子句可以在表达式有效的任何地方使用。每 condition是一个返回布尔结果的表达式。如果 条件的结果为true,CASE表达式的值为 结果遵循条件,以及CASE的其余部分 表达式未处理。如果条件的结果不正确, 任何后续的WHEN条款都以同样的方式进行审查。如果不 当条件产生true时,CASE表达式的值为 ELSE子句的结果。如果省略ELSE子句而不是 condition为true,结果为null。
Rails版本:
Product.select("price, currency, CASE
WHEN currency='USD' THEN price * 1
WHEN currency='RUB' THEN price * 65
ELSE price END as final_price")
.where("final_price BETWEEN ? AND ?", 10, 100)
答案 1 :(得分:0)
您可以使用此
Product.select("price, currency, CASE WHEN currency='USD' THEN price * 1 WHEN currency='RUB' THEN price * 65 ELSE price END as final_price").where("final_price BETWEEN ? AND ?", 10, 100)
希望这对你有用。