具有BigDecimals的对象在to_s上返回空字符串

时间:2011-08-07 03:56:18

标签: ruby-on-rails ruby activerecord instance-variables bigdecimal

我有一个用于存储地理坐标的location表:

class Location < ActiveRecord::Base
  # Location has columns/attributes
  #   BigDecimal latitude
  #   BigDecimal longitude

  (...)

  def to_s
    @latitude.to_s << ', ' << @longitude.to_s
  end
end

但是,当我在某个位置调用to_s时,BigDecimal内部会转换为空字符串。

ruby > l
 => #<Location id: 1, latitude: #<BigDecimal:b03edcc,'0.4713577E2',12(12)>, longitude: #<BigDecimal:b03ecb4,'-0.7412786E2',12(12)>, created_at: "2011-08-06 03:41:51", updated_at: "2011-08-06 22:21:48"> 
ruby > l.latitude
 => #<BigDecimal:b035fb0,'0.4713577E2',12(12)> 
ruby > l.latitude.to_s
 => "47.13577" 
ruby > l.to_s
 => ", " 

知道为什么吗?

1 个答案:

答案 0 :(得分:3)

您的to_s实施错误,应该是:

def to_s
    latitude.to_s << ', ' << longitude.to_s
end

ActiveRecord属性与实例变量不同,访问对象内部@latitude与访问对象内部latitude不同,@latitude是实例变量但{{1}调用ActiveRecord为您创建的方法。

此外,实例变量在首次使用时会自动创建为latitude,因此原始nil只是这样做:

to_s

这不是您正在寻找的结果。