9

Railsアプリをmysql(mysql2 gem)からpostgres(pg gem)に変換しています。

mysqlを使用すると、ActiveRecord::Base.connection.select_value呼び出しはデータに従って入力された戻り値を返します。次に例を示します。

> ActiveRecord::Base.connection.select_value("SELECT COUNT(*) FROM errors")
=> 86
> ActiveRecord::Base.connection.select_value("SELECT exception FROM errors where id=565")
=> "TechTalk.Genome.SqlExecutionException"
> ActiveRecord::Base.connection.select_value("SELECT id FROM errors where id=565")
=> 565

ただし、postgresでは、connection.select_value常に文字列を返します。

> ActiveRecord::Base.connection.select_value("SELECT COUNT(*) FROM errors")
=> "1"
> ActiveRecord::Base.connection.select_value("SELECT id FROM errors")
=> "1"
> ActiveRecord::Base.connection.select_value("SELECT source FROM errors limit 1")
=> "webapp"

これはいくつかの単体テストを破りました。それらは修正可能ですが、これらの戻り値に依存する他のコードがあると確信しています。postgresを使用するときに適切に入力された戻り値を取得する方法はありますか?connection.select_value

4

2 に答える 2

4

簡単な答えはノーです。'pg'ドライバーは、ネイティブの'libpq'ドライバーの上に可能な限り薄いレイヤーを意図的に提供します。型キャストは行いません。これは、結果が使用されるドメインについてある程度の洞察を持っている高レベルのライブラリの責任であるためです。この決定の根拠はPostgreSQLWikiに文書化されており、メーリングリストでさらに話し合うことができれば幸いです。

于 2012-09-24T21:39:11.537 に答える
0

ここに着陸してactiverecord属性(Rails)固有の回答を探している人のために:私はいくつかのテスト(https://gist.github.com/gamov/8fe38733012931eb3360)を実行し、次のことを発見しました:

RequestedItem.where(id: 1).select(*, 10 AS tq).first.tq.class

Rails<4の文字列とRails>=4のFixnumを返します。

PostgresアダプターはタイプをDBからPersistenceモジュールに転送するため、キャストを透過的に実行できます。

于 2014-10-15T08:18:21.743 に答える