根据不同货币的价格范围搜索模型

时间:2015-09-17 09:40:12

标签: ruby-on-rails postgresql ruby-on-rails-4

情景:

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

用户希望以用户指定的货币搜索具有特定价格范围(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)

2 个答案:

答案 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)

希望这对你有用。