ruby-on-rails - 数据库、货币建模、本地化策略

标签 ruby-on-rails database e-commerce currency spree

在本地化货币环境中存储电子商务产品信息(即产品价格、当前价格)的最佳策略是什么?

我遇到了一个 issue in Spree, an e-commerce engine for Ruby on Rails关于使用本地化、分隔符、精度数字等显示货币。

然而,resolving the display of price became more complex,当我们必须确定数据库中的值存储是否应包括本地化分隔符/精度数字或被规范化时。该解决方案涉及本地化值的显示以及可能规范化数据库中存储的值。但我不确定这是否是标准做法(清理数据以适应“标准”精度和定界符,或者修改模型以接受“货币”字段,并保持输入标准。

案例研究:

如果来自美国的产品(使用“en”本地化文件)定价为 2.99,则它在数据库中存储为 2.99。 如果站点更新为德国本地化(使用“de”本地化文件),那么它的价格为 2,99。 但是,该价格(和 cost_price)值的更新应该存储为 2.99 还是 2,99?如果它们存储在 2.99 并且值从模型返回到 View ,则本地化会将值修改为 2,99。

我对在用户不知情的情况下对用户输入进行标准化犹豫不决。标准化货币值是正常的,还是应该更改模型以处理多货币格式?

另一个需要注意的问题是,尽管 Spree 引擎可以更改本地化,但我认为它还不能根据用户需求进行翻转。所以我相信这在技术上不是一个“多货币”环境?我想选择一个可以扩展的选项。

相关问题:

  1. database design: accounts with multi currency
  2. Currency modeling in database

最佳答案

问题是您有一种产品,在具有不同文化的不同交换制度下销售。假设在美国是 1,450.00 美元,在德国是 1111,11 欧元。有两个主要因素:

一个。不同货币有不同价格
B. 不同的文化有不同的金额表示方式

关于A,你可以

  • 以一种价格/货币存储,并即时调整以适应不同的汇率
  • 或每晚调整
  • 或者只是在不同的国家有不同的价格

我会使用按货币分隔的价格表。每晚更新可能是合理的:

ProductId  Currency  Price
1          EUR       1111.11
1          CAD       1436.65
1          USD       1450.00

这些值应该是数字,以便您可以在必要时轻松地对它们进行数学运算。在你的数据库中使用 decimal(10,2)

关于 B

您应该在显示时将所选价格格式化为给定的文化。想象一个美国人用欧元支付。他们想看到什么?根据所选的区域性,您的输出将如下所示:

假设是 1,111.11 欧元

Culture  Price    Long Name
de_de   1.111,11  (German)
fr_ca   1 111,11  (Quebec)
en_us   1,111.11  (US English)

都是一样的数量,只是格式不同,取决于用户的喜好。

如果用户输入的数量不同,您还必须根据所选的区域性解析他们的值。查看 Yii 的(抱歉,PHP)L10N 和 I18N features .

注意事项:

无论您做什么,都不要将其存储为 float ,否则随着时间的推移您会出现细微的错误。使用小数类型

考虑在作为计算结果的字段中使用小数点后 4 位

关于ruby-on-rails - 数据库、货币建模、本地化策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9651388/

相关文章:

ruby-on-rails - sort_by 与子查询花费太长时间

mysql - 如何在mysql 5.7中使用 "OR"条件访问5000万条记录

php - query_cache_min_res_unit;它是什么以及它有什么作用?

paypal - 多个网站 - 一个网站付款专业帐户?

ruby-on-rails - Spree 作为多语言/双语网站

ruby-on-rails - Rails - 使用 :include to find objects based on their child's attributes

ruby-on-rails - 设计首次使用 Rails 登录

ruby-on-rails - 获取 nil :NilClass on the view new 的未定义方法 `errors'

java - sqlite 数据库连接 : java. Lang.ClassNotFoundException : org. sqlite.JDBC

php - 收到购买后发出登录信息