如何使用activerecord和postgresql使字段服从“scale”

时间:2014-11-21 21:55:26

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

我使用ActiveRecord在PostgreSQL列中存储一个简单的价格数字,如下所示:

  t.decimal :base_price, precision: 9, scale: 2

实际数据中的一切看起来都很准确;如果我存储类似" 5.50"的值,那么它就是" 5.50"。但是,当使用ActiveModelSerializers时,它总是吐出" 5.5",这是预期的,我只想默认将其格式化为货币。我怎么能做到这一点?

2.1.4 :004 > c.base_price
 => #<BigDecimal:7fd3739900e0,'0.55E1',18(18)> 
2.1.4 :005 > c.base_price.to_i
 => 5 
2.1.4 :006 > c.base_price.to_f
 => 5.5 

目前,我在我的Serializer上有一个自定义方法可以确保这一点,但我觉得可能有更好的,更多的Rails-y方式......

def price
  "%.2f" % object.base_price
end

1 个答案:

答案 0 :(得分:0)

我最终在我的Serailizer中使用了格式,如下所示:

def price
  "%.2f" % object.base_price
end

但是,当我在Ember.js项目中使用Ember Data时,我还为我的项目添加了一个转换:

// transforms/currency.js

import DS from 'ember-data';

var format = function(number) {
  return parseFloat(number, 10).toFixed(2);
}

export default DS.Transform.extend({

  deserialize: function(serialized) {
    return format(serialized);
  },

  serialize: function(deserialized) {
    return format(deserialized);
  }

});

然后在我的DS.Model中:

  basePrice: DS.attr('currency')

这有效地格式化了我在客户端需要的浮点数。