Rails迁移中的PostgreSQL点类型

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中有点类型.我只需要存储纬度和经度,没有任何其他选择.

如何使用此点类型或在这种情况下使用哪种更好?

谢谢.

bri*_*ver 7

您可以将数据类型指定为字符串

t.column 'point', 'point'
Run Code Online (Sandbox Code Playgroud)

  • 第一个"point"是列名,第二个是列类型. (2认同)

Yan*_*nto 6

Rails 对 point 的支持已有好几年了。自 Rails 4.2 beta 以来,测试用例就已经存在。

如果您使用的是 Rails 4.2 或更高版本。你不应该得到这个错误。我还没有在 4.2 beta 上测试过它。我只在 Rails 5.2 上测试它,它无需任何额外的 gem 即可工作。

https://github.com/rails/rails/blob/24adc20ace69ec0fcf317e0a8d91d112478ba015/activerecord/lib/active_record/connection_adapters/postgresql/oid/point.rb

用法:

移民

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)


Kir*_*rat 3

您收到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