在我们的申请中,我们存储了他们以各自的货币插入的不同捐赠者的多个项目资金,例如德国为欧元,瑞典为瑞典克朗等。
我们的想法是以一种货币提供这些项目的报告。 我们目前将资金数额与货币一起存储在如下表格中:
development=> \d funding_forecasts
Table "public.funding_forecasts"
Column | Type | Modifiers
-------------+------------------------+----------------------------------------------------------------
id | integer | not null default nextval('funding_forecasts_id_seq'::regclass)
project_id | integer |
year | integer |
currency | character varying(255) |
payments | integer |
commitments | integer |
我们还有一个exchange_rates表,用于存储每年从基础货币到特定货币的汇率。
现在的问题是,当我们创建报告时,我们需要查询每个项目的大量资金表,因此在应用程序端有大量的查询和大量的货币转换和聚合。
我觉得很酷,因为Rails对自定义SQL不太灵活(我知道它可以但很麻烦)是或多或少透明地进行转换,也许使用自定义数据类型可以轻松实现聚合(使用sum和+/-等运算符).. 无论如何我完全不确定这一点,所以非常感谢所有评论!
答案 0 :(得分:1)
您是否看过Martijn van Oosterhout的tagged types
内容?
答案 1 :(得分:0)
以前没有多次使用货币转换,随着时间的推移汇率开支和执行所有计算似乎要花费很多。
在我看来,更好的解决方案可能是将钱存入单一货币,这取决于货币转换成货币的那一天。因此,如果捐款人A以SEK结账,但您的组织以欧元运作,则将支票带到银行,然后将其兑换为欧元。我会以欧元输入银行给我的金额。
我知道这个解决方案不适用于未来捐款的承诺。是否有可能要求每个人用同一种货币捐款?
答案 2 :(得分:0)
我认为您应该为表添加另一列 - payments_in_usd
。当捐赠者支付时,将捐款的货币和支付金额根据支付时间的汇率保存。对于未来的承诺,您不知道美元的金额是多少,但您可以轻松地将当前汇率用于当前的承诺价值。
要查看您希望以美元支付的费用,请使用:
select sum(commitments*current_exchange_rate(currency))
当你想知道支付多少时,只需:
select sum(payments_in_usd)