Rails 4-为什么在Postgres中将十进制列的值四舍五入-用于存储纬度和经度

时间:2018-11-04 21:56:43

标签: ruby-on-rails postgresql ruby-on-rails-4 geocoding rails-geocoder

在带有Postgres DB的Rails 4应用程序中,“我的应用程序”获取供应商的地址并在地图上显示出来,这应该很准确。对于地理编码,我正在使用geocoder gem。但是无论我做什么,纬度/经度值总是通过四舍五入来存储的,而忽略了迁移文件中指定的精度/比例。

###migration file - addresses table===========================
      t.text :address_1
      t.text :landmark
      t.text :street
      t.string :city,add_index:true
      t.string :state,add_index:true
      t.string :zipcode
      t.string :country,add_index:true
      t.string :country_code
      t.string :slug, index:true
      ##special care for geospatial coordinates
      t.decimal :latitude, {:precision=>15, :scale=>15}
      t.decimal :longitude, {:precision=>15, :scale=>15}
      t.boolean :active,:default=>true

##in address.rb===============================================
geocoded_by :address_1
reverse_geocoded_by :latitude, :longitude do |obj,results|
  if geo = results.first
    obj.street = geo.formatted_address
    obj.state   = geo.state
    obj.city    = geo.city
    obj.zipcode = geo.postal_code
    obj.country = geo.country
    obj.country_code = geo.country_code
  end
end
after_validation :geocode, :reverse_geocode ,:if => :address_1_changed?
But every time, the values are rounded off to a precision of 6.For example - 
Even if I try to update the latitude/longitude manually through the console. 
     

我无法获得我定义的专用值   迁移文件(精度和小数位数为15)

##in rails console
 2.4.1 :003 > Address.last.update_attributes(:longitude => "73.1338649019608")                                                                                                                    
   (0.5ms)  BEGIN
    blah blah blah
   (0.4ms)  COMMIT
 => true 
2.4.1 :004 > Address.last.longitude.to_s
 => "73.133864902" 
##values are rounded off :(

Geocoder是否存在问题,或者Postgres是否有问题。

请帮助

1 个答案:

答案 0 :(得分:0)

我高度怀疑这是postgres的问题,您还没有达到ruby的小数位数限制,因此我怀疑geocoder会自动为您舍入它。我很好奇您为什么需要这种精度。在地址解析器自述文件中,他们提供了此链接https://en.wikipedia.org/wiki/Decimal_degrees#Accuracy,该链接显示小数位数为8个小数位的小数可提供以毫米为单位的精度。