以不同货币搜索给定价格范围的模型



场景:

产品以用户指定的货币显示,而每个产品都有自己的原始货币(可以与用户指定的相同,也可以是任何其他货币(

用户希望以用户指定的货币(假设为美元(搜索特定价格范围(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)

希望这对你有用。

最新更新