Резюме: это может сработать, если вы измените его на:
Model.create(:the_name_of_your_geo_column => Point.from_x_y(10,20))
Более длинная версия, с высокой вероятностью ревущих Руби: я едва написал слово 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, но все вышеперечисленное работает (для меня), и вы, возможно, сможете адаптировать его к вашему делу.