【问题标题】:Search for a model given price range in different currencies以不同货币搜索给定价格范围的模型
【发布时间】:2015-12-14 03:11:55
【问题描述】:

场景:

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用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 是一个返回布尔结果的表达式。如果 条件的结果为真,CASE 表达式的值为 符合条件的结果,以及 CASE 的其余部分 不处理表达式。如果条件的结果不正确, 任何后续的 WHEN 子句都以相同的方式进行检查。如果不 当条件为真时,CASE 表达式的值为 ELSE 子句的结果。如果省略 ELSE 子句并且没有 条件为真,结果为空。

    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)
    

    【讨论】:

    • 我会试试的。 activerecord 支持 CASE 吗?我需要安装 postgres 扩展吗?
    • @NickGinanto CASE 默认在 pg 中可用。我认为活动记录不支持任何好的编写方式
    • 好的,这对我有帮助,但解决方案并不完整,因为您不能在 where 子句中从 select 中获得别名。所以更好的答案是在 where 子句中而不是在 select 中包含 case 子句
    【解决方案2】:

    你可以用这个

    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)
    

    希望这对你有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      相关资源
      最近更新 更多