Объект с BigDecimals возвращает пустые строки в to_s - PullRequest
0 голосов
/ 07 августа 2011

У меня есть таблица 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 Ответ

3 голосов
/ 07 августа 2011

Ваша to_s реализация неверна, должно быть так:

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

Атрибуты ActiveRecord не совпадают с переменными экземпляра, и доступ к @latitude внутри объекта не совпадает с доступом к latitude внутри объекта @latitude является переменной экземпляра, но latitude является вызовом метода, который ActiveRecord создает для вас.

Кроме того, переменные экземпляра автоматически создаются как nil при первом использовании, так чтоoriginal to_s просто делал это:

nil.to_s << ', ' << nil.to_s

и это не тот результат, который вы ищете.

...