Tôi đang cố gắng sử dụng đá quý mã hóa địa lý để tra cứu địa chỉ và tọa độ. Tôi muốn nó hoạt động cùng với cơ sở dữ liệu không gian PostGIS của tôi và đá quý RGeo, sử dụng các tính năng POINT thay vì lưu các giá trị vĩ độ và kinh độ một cách riêng biệt. Vì vậy, tôi đã cố gắng để làm việc vào mô hình của tôi để lưu các kết quả từ tra cứu geocoder vào một tính năng POINT RGeo:Mã hóa địa lý địa chỉ với mã hóa địa lý và cơ sở dữ liệu PostGIS với RGeo
class Location < ActiveRecord::Base
attr_accessible :latlon, :name, :address
set_rgeo_factory_for_column(:latlon, RGeo::Geographic.spherical_factory(:srid => 4326))
geocoded_by :name_and_address do |obj, results|
if geo = results.first
obj.latlon = Location.rgeo_factory_for_column(:latlon).point(geo.longitude, geo.latitude)
end
end
after_initialize :init
after_validation :geocode
def init
self.latlon ||= Location.rgeo_factory_for_column(:latlon).point(0, 0)
end
def latitude
self.latlon.lat
end
def latitude=(value)
lon = self.latlon.lon
self.latlon = Location.rgeo_factory_for_column(:latlon).point(lon, value)
end
def longitude
self.latlon.lon
end
def longitude=(value)
lat = self.latlon.lat
self.latlon = Location.rgeo_factory_for_column(:latlon).point(value, lat)
end
def name_and_address
"#{self.name}, #{self.address}"
end
end
Trong Rails console bây giờ tôi có thể làm:
test = Location.new(name: "Eiffel Tower") // => #<Location id: nil, name: "Eiffel Tower", latlon: #<RGeo::Geographic::SphericalPointImpl:0x81579974 "POINT (0.0 0.0)">, created_at: nil, updated_at: nil, address: nil>
test.geocode // => #<RGeo::Geographic::SphericalPointImpl:0x81581ac0 "POINT (2.294254 48.858278)">
tuyệt vời! Tuy nhiên, khi tôi muốn lưu bài kiểm tra vị trí của mình, mà gây nên các :after_validation
gọi cho :geocode
tôi nhận được một lỗi:
NoMethodError: undefined method `lon' for nil:NilClass
from /Users/sg/rails-projects/geo_rails_test/app/models/location.rb:24:in `latitude='
from /Users/sg/rails-projects/geo_rails_test/app/models/location.rb:7:in `block in <class:Location>'
from /Users/sg/.rvm/gems/ruby-1.9.3-p194/gems/geocoder-1.1.2/lib/geocoder/stores/base.rb:108:in `call'
from /Users/sg/.rvm/gems/ruby-1.9.3-p194/gems/geocoder-1.1.2/lib/geocoder/stores/base.rb:108:in `do_lookup'
from /Users/sg/.rvm/gems/ruby-1.9.3-p194/gems/geocoder-1.1.2/lib/geocoder/stores/active_record.rb:278:in `geocode'
from /Users/sg/.rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.8/lib/active_support/callbacks.rb:405:in `_run__1498365873506454431__validation__51840359655181017__callbacks'
[...]
Dường như callback geocode xóa các đối tượng RGeo để nó được xây dựng trong các phương pháp cũng như phương thức getter và setter của tôi không còn nữa. Tại sao? Bất kỳ ý tưởng?