Rails-大陆,国家和城市的地理编码

时间:2018-07-31 15:05:18

标签: ruby-on-rails rails-geocoder

我正在尝试整理一些世界上最好的城市的目录。

我有:

    ContinentsController < ApplicationController
      def index 
      end 

      def show 
      end 
    end

    CountriesController < ApplicationController
      def index 
      end 

      def show 
      end 
    end

    CitiesController < ApplicationController
      def index 
      end 

      def show 
      end
    end

以及:

    class Continent < ApplicationRecord
      has_many :countries
      validates :continent_name, presence: true
    end

    class Country < ApplicationRecord
      belongs_to :continent 
      has_many :cities
      validates :country_name, presence: true 
      validates :continent_id, presence: true 
    end

    class City < ApplicationRecord
     belongs_to :continent 
     belongs_to :country
     validates :city_name, presence: true 
     validates :country_id, presence: true 
     validates :continent_id, presence: true
    end

我正在使用地理编码器gem。我将如何对此进行地理编码? country_namecity_name都需要对城市进行地理编码,因为世界不同地区的城市可以共享相同的名称。一个例子是位于俄罗斯和美国的圣彼得堡。

    class City < ApplicationRecord
     geocoded_by :city_name
     after_validation :geocode, if: :city_name_changed?
    end

这在圣彼得堡不起作用,因为它只是对city_name而不是country_name进行地理编码。

非常感谢!

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

class City < ApplicationRecord
 geocoded_by :address
 after_validation :geocode, if: :city_name_changed?

 def address
   "#{city_name}, #{country_name}"
 end
end

文档显示以下内容:

def address
  [street, city, state, country].compact.join(', ')
end

https://github.com/alexreisner/geocoder#geocoding-objects

答案 1 :(得分:0)

地理编码不必是一列,它可以是一个实例方法

class City < ApplicationRecord

  geocoded_by :address

  def address
    [city_name, country_name].compact.join(', ')
  end

end