2012-09-24 9 views
9

私は、レールアプリをmysql(mysql2 gem)からpostgres(pg gem)に変換しています。 MySQLでconnection.select_valueは、pg gemを持つpostgresの文字列のみを返します

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

短い答えはノーです。 'pg'ドライバは意図的にネイティブの 'libpq'ドライバの上にできるだけ薄いレイヤーを提供します。タイプキャスティングは行われません。結果が使用されるドメインについてのいくつかの洞察を持つ上位レベルのライブラリの責任です。この決定の根拠はon the PostgreSQL Wikiと書かれており、私はあなたといっしょにそれについて話し合うことを嬉しく思っています。on the mailing list

+4

最悪の最善の答え! ;)ありがとう。 –

+0

"ネイティブの 'libpq'ドライバの上にできるだけ薄いレイヤーを作成してください。"問題は、Rubyの文字列割り当ては実際には非常に高価で、無駄だと思う。 –

+0

各列に文字列を割り当てたり、PostgreSQLの型をデフォルトでRubyにマップするのは無駄だと思う。列の型がすべてRubyで正確な数値派生(BigNum以外)のものであれば、それらをすべてStringとして表すのは無駄でしょう。しかし、比較的まれな状況の中で潜在的なメモリの無駄に基づいて部分的に完全な型マッピングシステムにしかならないものを実装するのは無責任なようです。 –

0
ActiveRecordの属性(Railsの)具体的な答えを探してここに上陸人のため

: 私はいくつかのテスト(https://gist.github.com/gamov/8fe38733012931eb3360を)やったし、その発見:

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

はRailsの< 4とを持つ文字列を返しますFixnum with Rails> = 4

Postgresアダプタは、キャストが透過的に行われるように、DBからPersistenceモジュールに型を転送します。

関連する問題