场景:
产品以用户指定的货币显示,而每个产品都有自己的原始货币(可以与用户指定的相同,也可以是任何其他货币(
用户希望以用户指定的货币(假设为美元(搜索特定价格范围(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)
您可以使用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子句并且没有条件为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)
您可以使用此
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)
希望这对你有用。