Rails Ruby 中的反向地理编码时出现 Postgresql 错误

Postgresql error when reverse geocoding in Ruby on Rails

我在尝试使用地址解析器 rails gem 进行批量反向地址解析时遇到问题:https://github.com/alexreisner/geocoder

我有以下型号:

class School < ActiveRecord::Base
  reverse_geocoded_by :latitude, :longitude

  has_one :address
end

class Address < ActiveRecord::Base
  belongs_to :school
end

以及以下迁移:

class CreateSchools < ActiveRecord::Migration
  def change
    create_table :schools do |t|
      t.string :name
      t.integer :address_id

      t.timestamps null: false
    end
  end
end

class CreateAddresses < ActiveRecord::Migration
  def change
    create_table :addresses do |t|
      t.string :line_1
      t.string :line_2
      t.string :line_3
      t.string :city
      t.string :region
      t.string :country
      t.string :code

      t.timestamps null: false
    end
  end
end

并且当我 运行 以下行时: rake geocode:all CLASS=School REVERSE=true SLEEP=0.5

我收到这个错误:

ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column schools.address does not exist
LINE 1: SELECT  "schools".* FROM "schools" WHERE (schools.address IS...
                                                  ^
: SELECT  "schools".* FROM "schools" WHERE (schools.address IS NULL)  ORDER BY "schools"."id" ASC LIMIT 1000

我知道自述文件是这样说的:

"For geocoding your model must provide a method that returns an address. This can be a single attribute, but it can also be a method that returns a string assembled from different attributes (eg: city, state, and country)."

我认为这意味着我需要学校模型的方法或学校的属性 table 我选择了后者,但我不确定我错过了什么。

谢谢!

问题是反向地理编码 rake 任务首先加载所有还没有地址列的记录。它使用 this scope:

scope :not_reverse_geocoded, lambda {
  where("#{table_name}.#{geocoder_options[:fetched_address]} IS NULL")
}

问题是您在 schools 上没有任何可以使用的列。相反,您应该将 reverse_geocoded_by 声明移动到 Address class。您还需要添加一个 addresses.address 列或执行以下操作:

reverse_geocoded_by :latitude, :longitude, fetched_address: :line_1

此外,您似乎没有 latitudelongitude 的列。当然那些也应该在 Address 上,而不是 School。毕竟,如果一所学校可以有多个地址,那么它的 lonlat 是哪个?