执行摘要:如果您将其更改为:它可能会起作用:
Model.create(:the_name_of_your_geo_column => Point.from_x_y(10,20))
较长的版本,很可能是 Ruby 咆哮:我几乎没有写过 rb 的一个字,但本周看到了太多伟大的项目,无法继续处于无知状态。处理irb 中的错误消息(语言中从 0 开始但对 PostGIS 非常熟悉):
ActiveRecord::Base.establish_connection(:adapter=>'postgresql',:database=>'moveable')
pt = TablePoint.new(:data => "Hello!",:geom => Point.from_x_y(1,2))
NameError: uninitialized constant Point
所以,require 'postgis_adapter',然后:
PGError: ERROR: relation "table_points" does not exist
这一定是我听说过的 ActiveRecord 中很棒的命名约定。所以创建一个名为table_points 的表,因为我不知道数据库模型/同步方法是什么。
moveable=> create table table_points(data text, geo_something geometry);
注意这里我使用了geometry 而不是geography,因为我对您的问题的第一直觉是数据库适配器层中的建模方法创建了点类型。事实上,一点也不。然后在irb,
pt = TablePoint.new(:geom => Point.from_x_y(1,2))
ActiveRecord::UnknownAttributeError: unknown attribute: geom
没有名为geom的属性?只是想看看会发生什么,再次psql:
moveable=> alter table table_points add column geom geometry;
ALTER TABLE
然后:
irb(main):014:0> pt = TablePoint.new(:geom => Point.from_x_y(10,20))
=> #<TablePoint data: nil, geo_something: nil, geom: #<GeoRuby::SimpleFeatures::Point:0x1022555f0 @y=20, @with_m=false, @x=10, @m=0.0, @with_z=false, @z=0.0, @srid=-1>>
irb(main):015:0> pt.save
=> true
难以置信!如果我这样做了会怎样:
pt = TablePoint.new(:data => 'is this even possible?', :geom => Point.from_x_y(38,121), :geo_something => Point.from_x_y(37,120))
=> #<TablePoint data: "is this even possible?", geo_something: #<GeoRuby::SimpleFeatures::Point:0x102041098 @y=120, @with_m=false, @x=37, @m=0.0, @with_z=false, @z=0.0, @srid=-1>, geom: #<GeoRuby::SimpleFeatures::Point:0x1020410c0 @y=121, @with_m=false, @x=38, @m=0.0, @with_z=false, @z=0.0, @srid=-1>>
irb(main):023:0> pt.save
=> true
更令人难以置信!
moveable=> select * from table_points;
data | geo_something | geom
--------+-----------------+--------
| | 0101000000000
| 010100000000000 |
| 010100000000000 |
...ble? | 00005E400000000 | 010000405E40
(4 rows)
由于根本不熟悉 Ruby,我不愿将其作为答案发布,但上述工作(对我来说令人费解),您也许可以根据您的情况进行调整。