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

场景:

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

用户希望以用户指定的货币搜索具有特定价格范围(10 – 100)的产品(假设为美元)

我正在使用postgres和Rails。 每种产品都有原始货币的price_amount和货币。

问题因为每个产品都可以是任何货币,我需要将所有产品标准化为用户指定的货币,这样我才能看到哪个产品在范围内。

我有每对支持货币的汇率。 但是查询真的很复杂,所以我想知道是否有更高效的东西?

currencies.map do |currency| rate = ex_rate(user_specific_currency, currency) query = [query , "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子句就可以使用。 每个条件都是一个返回布尔结果的表达式。 如果条件的结果为true,则CASE表达式的值是条件后面的结果,并且不处理CASE表达式的其余部分。 如果条件的结果不成立,则以相同的方式检查任何后续的WHEN子句。 如果没有WHEN条件产生true,则CASE表达式的值是ELSE子句的结果。 如果省略ELSE子句且没有条件为真,则结果为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) 

希望这对你有用。