2012-09-24 16 views
9

Ben mysql (mysql2 gem) postgres (pg gem) kullanarak bir ray uygulaması dönüştürüyorum. Mysql ileconnection.select_value yalnızca pg gem ile postgres dizeleri döndürür

, ActiveRecord::Base.connection.select_value aramalar örneğin verilerine göre yazdığınız değerleri döndürür:

> 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 

Ancak Postgres'e ile connection.select_value hep bir dize döndürür: Bu işlem birkaç birimi kırdı

> 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" 

testler ve bunlar düzeltilebilir olsa da, eminim bu dönüş değerlerine dayanan başka bir kodumuz var. Postgres kullanırken connection.select_value'dan doğru yazılan dönüş değerleri almanın bir yolu var mı?

cevap

4

Kısa cevap no. 'Pg' sürücüsü, yerel 'libpq' sürücüsünün üzerinde mümkün olduğunca ince bir katman sağlar. Bu, sonuçların kullanılacağı alana bir miktar içgörüye sahip olan daha yüksek düzeydeki kütüphanelerin sorumluluğu olduğu için, tipleme yapmaz. Bu kararın gerekçesi on the PostgreSQL Wiki belgelenmiştir ve daha fazla on the mailing list ile görüşmekten memnuniyet duyarız.

+4

Şimdiye kadarki en kötü cevap! ;) Teşekkürler. –

+0

"yerel 'libpq' sürücüsünün üzerine mümkün olduğunca ince bir katman." Sorun şu ki, Ruby'de string tahsisleri aslında oldukça pahalı, bu kadar savurgan görünüyor. –

+0

Sanırım her sütun için dizeleri ayırmak ya da PostgreSQL tiplerini varsayılan olarak Ruby ile eşlemeye çalışmak daha israf edici bir durum. Sütun türlerinizin tümü Ruby'de Sayısal türetilmiş (BigNum olmayan) eşdeğere sahipse, bunların tümünü Dizeler olarak göstermek büyük olasılıkla israftır. Bununla birlikte, nispeten nadir görülen durumdaki potansiyel bellek atığına dayalı olarak sadece kısmen tamamlanmış bir tip haritalama sisteminin ne olabileceğini uygulamak benim için sorumsuz görünmektedir. –

0
bir activerecord nitelikler (Raylar) belirli cevap arayan burada karaya olanlar için

: bazı testler (https://gist.github.com/gamov/8fe38733012931eb3360) yaptık ve keşfetti:

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

Raylar < 4 ve bir dize döndürür Fixnum Rails ile => 4.

Postgres adaptörü, türleri DB'den Kalıcılık modülüne iletecek, böylece döküm işlemi saydam bir şekilde gerçekleştirilebilir.