搜索给定不同货币价格范围的模型
场景:
产品以用户指定的货币显示,而每种产品都有自己的原始货币(可能与用户指定的货币相同,可以是任何其他货币)
用户希望以用户指定的货币搜索具有特定价格范围(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)
希望这对你有用。
- 本地postrges工作,但似乎无法推动到RAILS_ENV =生产heroku
- 你已经拿破了包 – Postgres gem for rails
- 用点击将SQLite数据库推送到Heroku?
- Rails 3迁移:boolean(mysql vs postgreSQL)
- Ruby Sequel:查询返回的数组作为String对象返回,而不是Array对象
- validation在另一个表上具有条件时,数据库中的唯一性validation
- Ruby on Rails:有没有办法从数据库中提取项目并按指定顺序返回它们?
- Rails 3.1:在一个时间范围内查询Postgres的记录
- 生产失败/ heroku:WHERE a.attrelid =’“学校”’:: regclass