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
此外,您似乎没有 latitude
和 longitude
的列。当然那些也应该在 Address
上,而不是 School
。毕竟,如果一所学校可以有多个地址,那么它的 lonlat 是哪个?
我在尝试使用地址解析器 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
此外,您似乎没有 latitude
和 longitude
的列。当然那些也应该在 Address
上,而不是 School
。毕竟,如果一所学校可以有多个地址,那么它的 lonlat 是哪个?