Rails
MySQL
Gem
GIS
Rails5

Rails5.1でactiverecord-mysql2spatial-adapterを使う

map-2789052_1920.jpg

activerecord-mysql2spatial-adapterはRails + MySQLで位置情報を扱う場合に使用される事があるGemです。

https://github.com/rgeo/activerecord-mysql2spatial-adapter は、ややメンテナンスされていない印象を受けます。

Rails 5.1.6にて、使用するとこんな感じ。

$ bin/rake db:migrate
rake aborted!
NoMethodError: undefined method `attribute_types_cached_by_default' for ActiveRecord::Base:Class
Did you mean?  attribute_type_decorations

Active Record 5 · Issue #19 · rgeo/activerecord-mysql2spatial-adapter を参考に https://github.com/sebastianiorga/activerecord-mysql2spatial-adapter/tree/rails-5 を使わせて頂く。

gem 'activerecord-mysql2spatial-adapter', github: 'sebastianiorga/activerecord-mysql2spatial-adapter', branch: 'rails-5'

するとこんな感じ

$ bin/rake db:migrate
rake aborted!
NameError: uninitialized constant RGeo::ActiveRecord::DEFAULT_SPATIAL_COLUMN_CONSTRUCTORS

Tasks: TOP => db:migrate
(See full trace by running task with --trace)

別のリポジトリのIssueですが https://github.com/stadia/activerecord-mysql2rgeo-adapter/issues/7 によると https://github.com/rgeo/rgeo-activerecord/commit/bc89717b48bfc64817cca75d1981706ed3c3af3d のように DEFAULT_SPATIAL_COLUMN_CONSTRUCTORS が削除されています。

とりあえず、動かすならばこのコードを補完してあげれば良さそうです。

config/initializers/fix_activerecord_mysql2spatial_adapter.rb
# https://github.com/rgeo/rgeo-activerecord/commit/bc89717b48bfc64817cca75d1981706ed3c3af3d
module RGeo
  module ActiveRecord
    # Some default column constructors specifications for most spatial  +    # Return a feature type module given a string type.
    # databases. Individual adapters may add to or override this list.
    DEFAULT_SPATIAL_COLUMN_CONSTRUCTORS = {
      geometry_collection: {}.freeze,
      geometry:            {}.freeze,
      line_string:         {}.freeze,
      multi_line_string:   {}.freeze,
      multi_point:         {}.freeze,
      multi_polygon:       {}.freeze,
      point:               {}.freeze,
      polygon:             {}.freeze,
      spatial:             { type: "geometry" }.freeze,
    }.freeze
  end
end

これでbin/rake db:migrateが通るようになりました。

これは一時的な対策なので、ほかの方法を検討すべきかと考えています。