Могу ли я удалить или изменить ограничение размера геометрии таблицы PostgreSQL с помощью миграции на Rails? - PullRequest
0 голосов
/ 20 января 2011

вопрос

Я использую Rails 2.3 с плагином Spatial Adapter и базу данных Postgres 8.4 с расширением PostGIS.

Некоторое время назад геометрическое поле было добавлено в таблицу с помощью такой миграции:

add_column :my_table, :the_geom, :geometry, :srid => 4326

Наряду с полем создается ограничение размера таблицы. В этом случае он гарантирует, что геометрия, введенная в поле the_geom , имеет ровно два измерения .

Теперь я хотел бы добавить геометрию с более чем двумя измерениями. Какой код миграции Rails можно использовать, чтобы либо изменить ограничение, чтобы разрешить более двух измерений, либо удалить его вообще?

Что не сработало

Когда я создаю новое геометрическое поле с помощью метода add_column, я знаю, что могу использовать опции :with_z и :with_m, чтобы увеличить количество разрешенных измерений (ограничение будет разрешать до четырех измерений при использовании обоих опции).
Однако при использовании этих параметров с командой change_column это никак не влияет на ограничение.
Я не хочу удалять столбец и повторно добавлять его, потому что тогда я потеряю все данные.

Я знаю, я могу использовать необработанный SQL для удаления ограничения (я мог бы также использовать задачу переноса или рейка в качестве оболочки). Проблема в том, что это не влияет на тестовую базу данных, потому что она всегда создается с нуля, когда я запускаю все тесты.

Ответы [ 3 ]

1 голос
/ 25 января 2011

Невозможно изменить столбец геометрии без обращения к необработанному SQL с помощью ActiveRecord::Base.connection.execute.

К сожалению, необработанные операторы SQL не попадают в схему базы данных Rails, поэтому ограничения остаются в БД,воссоздается (для тестов, например).

1 голос
/ 20 января 2011

Я не знаком с полями / опциями пространственного адаптера, так что этот код может быть немного неправильным, но как насчет чего-то вроде этого?

0 голосов
/ 03 марта 2015

Некоторые необработанные операторы SQL попадают в схему базы данных. Следующее изменяет тип столбца с геометрии на географию:

class ChangePostGisGeometryToGeography < ActiveRecord::Migration
  def up
    execute <<-SQL
      ALTER TABLE mytable ALTER COLUMN geom TYPE geography(MULTIPOLYGON,4326);
    SQL
  end
end

Миграция корректно изменяет db/schema.rb:

-    t.spatial  "geom", :limit => {:srid=>4326, :type=>"multi_polygon"}
+    t.spatial  "geom", :limit => {:srid=>4326, :type=>"multi_polygon", :geographic=>true}

(протестировано в Rails 3.2.13 и activerecord-postgis-adapter 0.6.6)

...