dor*_*way 5 ruby postgresql ruby-on-rails ruby-on-rails-4
我想使用PostgreSQL中的点类型.我弄完了:
rails g model Test point:point
Run Code Online (Sandbox Code Playgroud)
由此产生的迁移是:
class CreateTests < ActiveRecord::Migration
def change
create_table :tests do |t|
t.point :point
t.timestamps
end
end
end
Run Code Online (Sandbox Code Playgroud)
当我跑:
rake db:migrate
Run Code Online (Sandbox Code Playgroud)
结果是:
== CreateTests: migrating ====================================================
-- create_table(:tests)
rake aborted!
An error has occurred, this and all later migrations canceled:
undefined method `point' for #<ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::TableDefinition:0x000000038991a0>/home/i/Dropbox/programming/ruby/rails_pg_for_tests/db/migrate/20140306151700_create_tests.rb:4:in `block in change'
/home/i/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-4.0.2/lib/active_record/connection_adapters/abstract/schema_statements.rb:184:in `create_table'
/home/i/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-4.0.2/lib/active_record/migration.rb:625:in `block in method_missing'
/home/i/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-4.0.2/lib/active_record/migration.rb:597:in `block in say_with_time'
...
Run Code Online (Sandbox Code Playgroud)
可能是我需要安装PostGIS,但我不明白,如果我在PostgreSQL中有点类型.我只需要存储纬度和经度,没有任何其他选择.
如何使用此点类型或在这种情况下使用哪种更好?
谢谢.
您可以将数据类型指定为字符串
t.column 'point', 'point'
Run Code Online (Sandbox Code Playgroud)
Rails 对 point 的支持已有好几年了。自 Rails 4.2 beta 以来,测试用例就已经存在。
如果您使用的是 Rails 4.2 或更高版本。你不应该得到这个错误。我还没有在 4.2 beta 上测试过它。我只在 Rails 5.2 上测试它,它无需任何额外的 gem 即可工作。
用法:
移民
class CreateAddresses < ActiveRecord::Migration[5.2]
def change
create_table :addresses do |t|
t.point :coordinate
end
end
end
Run Code Online (Sandbox Code Playgroud)
创造新记录
Address.create coordinate: ActiveRecord::Point.new(1, 1)
Run Code Online (Sandbox Code Playgroud)
您收到undefined method 'point' for #<ActiveRecord:...迁移代码错误
t.point :point
Run Code Online (Sandbox Code Playgroud)
因为point中不存在方法ActiveRecord。
ActiveRecord原生支持以下data types,
:primary_key, :string, :text, :integer, :float, :decimal, :datetime, :timestamp,
:time, :date, :binary, :boolean
Run Code Online (Sandbox Code Playgroud)
有关相同内容,请参阅ActiveRecord 的官方文档。
正如 @bridiver 所建议的,您可以选择指定ActiveRecord支持的数据类型(如上面列出的)之外的类型,但如文档t.column :point, 'point'中引用的那样ActiveRecord
这与数据库无关,通常应该避免。
更新
activerecord-postgis-adapter gem我建议利用@euricovidal 所建议的 的好处。它是 pgsql 的地理空间扩展,它充当 PostGIS 查询函数的包装器,并允许您编写地理感知迁移。它将允许您创建一个point类型,并且使用它您当前的语法应该可以工作。
例如,请参阅PostGIS ActiveRecord 适配器:创建空间表。您还需要更新文件中的adapterto才能使其工作。postgisdatabase.yml