0

私のセットアップ:

  • Ruby 2.0.0
  • Rails 3.2.12
  • 最新のpg宝石
  • 最新のactiverecord-postgis-adapter宝石
  • 最新のrgeo-geojson宝石
  • Postgres 9.1.6
  • PostGIS 2

数日前に似たようなことを聞​​いたことがあります。(ブール値をPostgres(==文字列)からRubyブール値に変換する必要があります)。そこで、値をカスタム選択からブール値に変換する必要がありました。これを私のモデルに追加するだけで、これは非常に簡単でした。

def value_name
  ActiveRecord::ConnectionAdapters::Column.value_to_boolean(self[:value_name])
end

しかし今、私はタイプの値を受け取りますPoint(これはPostGISからのタイプです)。データベースでの文字列表現はのよう"0101000000EE7C3F355EF24F4019390B7BDA011940"に見えますが、(私が思うに)RGeo::Feature::Pointまたは多分RGeo::Geos::CAPIPointImpl?!になる必要があります。

今私はActiveRecord::ConnectionAdapters::Columnhttp://rubydoc.info/docs/rails/ActiveRecord/ConnectionAdapters/Column)を見ましたが、見つけることができるのはvalue_to_booleanとだけvalue_to_decimalです。

ActiveRecord::ConnectionAdapters::PostgreSQLColumn次に、 (http://rubydoc.info/docs/rails/ActiveRecord/ConnectionAdapters/PostgreSQLColumn )もあることを認識しましたが、有用なメソッドがないようです。

ありがとうございました!

4

3 に答える 3

2

そのようなことを試してください:

def value_name
  point_regex = /POINT \(([0-9]*\.[0-9]*) ([0-9]*\.[0-9]*)\)/
  match_data = self[:value_name].match(point_regex)
  match_data[1], match_data[2]
end

それはあなたのポイントを表すいくつかの値[x、y]を返します。逆を行う必要があります。つまり、value_name =(x、y)を定義します。

于 2013-02-27T17:16:56.297 に答える
2

rgeo私は解決策を見つけました(とを検索しましたparse):

def my_value
  a = RGeo::WKRep::WKBParser.new
  a.parse(self[:my_value])
end

私はそれが正しい方法であるかどうかを知る必要があります。Javaの世界から来て、私はそれを次のように読みました:

  • For every(!)my_value:WKBParserの新しいインスタンスを作成します

その場合:メソッドが呼び出されるたびに、インスタンスを1つだけ作成して再利用するにはどうすればよいですか?


または、より詳細に:自動パーサーはこれをどのように処理しますか?どこで呼ばれますか?

ここで作成されたと思います: https ://github.com/dazuma/activerecord-postgis-adapter/blob/master/lib/active_record/connection_adapters/postgis_adapter/spatial_column.rb (179行目と18​​1行目)

しかし、どうすればこれをモデルで再利用できますか?

背景情報:パーサーは実際のテーブル列に対して自動的に機能しますが、私の列はクエリ内で作成されます。


正しい方法を見つけました:

def my_value
  RGeo::Geos.factory.parse_wkb(self[:my_value])
end

:)

于 2013-02-27T17:46:39.090 に答える
2

うん、postgisアダプターは本当に機能し、はるかにエレガントなソリューションを提供します。

私のGemfileで:

gem 'rails', '3.2.12'

gem 'pg'
gem 'rgeo-activerecord'
gem 'activerecord-postgis-adapter'

次にモデルで:

class MyPoint < ActiveRecord::Base
  set_rgeo_factory_for_column(:geom, RGeo::Geos.factory(srid: 4326))
  attr_accessible :geom
end

GeosがRGeoインストールでサポートされているかどうかを確認するには:

>> RGeo::Geos::supported?
true

そして、それがあなたが得るものです-この場合のモデルの属性geom RGeo::Geos::CAPIPointImpl(ファクトリクラスによって異なります)。このファクトリを機能させるには、RGeoをインストールする前に、開発ファイルを含むGeosをインストールする必要があります。Geosファクトリおよび4326である必要はありません。RGeoには純粋なRubyで実装されたファクトリがあり、ドキュメントで最適なファクトリクラスとSRIDを見つけます:http://rubydoc.info/github/dazuma/rgeo/master/index

于 2013-03-12T16:52:13.893 に答える