2010-11-22 14 views
1

Ruby on Rails 3.0 ile salt okunur bir veritabanı üzerinde çalışıyorum (oracle_enhanced_adapter aracılığıyla bağlanıyor).Rails 3 ve Oracle: NLS Ayarları ondalık ayırıcıyı reddediyor

Bilinen "n + 1 sorguları" sorunuyla çalışırken, dahil yöntemini denedim.
Raylar'daki açıklamadan farklı olarak üretilen ikinci sorgu, gerekli kimliklerin tamsayı olarak değil, kayan değerlerin dize halinde temsilleri olarak listelenir. Orijinal kimlikleri NUMBER. Ne yazık ki NLS ayarları, ondalık ayırıcı olarak "," beklediği NLS_NUMERIC_CHARACTERS da dahil olmak üzere Almanya için geçerlidir. Bu yüzden her zaman ORA-01722 hata as described here olsun. Daha doğrusu

:

@var.assoc.includes(:another_assoc).where("column_1 = ?", some_value)

verimleri

ActiveRecord::StatementInvalid: OCIError: ORA-01722: invalid number: SELECT "TABLE_A".* FROM "TABLE_A" WHERE ("TABLE_A"."ID" IN ('1715.0','1716.0','1717.0','1718.0','1719.0','1720.0','1721.0'))

(o "sembole dize" gibi bazı rahatsız edici detaylar içeriyordu beri, yukarıdaki Raylı kodu basitleştirmek zorunda dönüşüm)

Veritabanından da anlaşılacağı gibi,

Veritabanında doğrudan çalıştı (

. Ancak raylar oturumunu değiştirmenin doğru yolunu bulamadım.

Bulduğum her şey, Rails 2'ye veya kullanımdan kaldırılmış işlevlere başvurmuş gibiydi.
Rails 3.0 için bunu nasıl çözebilirim?

Alternatif olarak: Tüm listelenen kimlikleri Fixnum'a dönüştürmek için Rails'i (veya belki de oracle_enhanced_adapter) nasıl zorlayabilirim?

Teşekkür ve saygılarımla, Tim

Biz Oracle kullanarak aynı problem vardı ve biz bir başlatıcısı ( config/initializers/something.rb yerleştirin) aşağıdaki kodu yerleştirerek onu çözdü
+0

Merhaba Tim, stackoverflow'a hoş geldiniz. Bu ifadeyi oluşturan ray kodunu gönderir misiniz? – Patrick

cevap

1

:

BigDecimal.class_eval do 
    alias :old_to_s :to_s 

    def to_s(format='F') 
    old_result = self.old_to_s(format) 
    (old_result[-2..-1] == ".0" ? old_result[0..-3] : old_result) 
    end 
end 

It birincil anahtar olarak kullandığınız sütun türünden kaynaklanır. Bir NUMBER olarak bildirirseniz, BigDecimal'a dönüştürülür. Alternatif olarak, kimliğinizi NUMBER(10) olarak veya daha ayrıntılı olarak FixNum (kimlikleri doğru bir şekilde dönüştürülecek) ile eşleştirecek şekilde bildirebilirsiniz.

Bu yardımcı olur umarım.

+0

teşekkürler çocuklar, harikasın :-) – bunter