2012-03-22 4 views
1

Мы имеем следующую модель:Является ли это возможной ошибкой в ​​«activerecord-jdbc-adapter» при попытке загрузить нагрузку?

payment.rb:

class Payment < ActiveRecord::Base 
    has_many :currencies 

    default_scope :include => :currencies 
end 

Мы используем default_scope для нетерпеливого нагрузки валюты. Когда мы управляем этим мы получаем следующее сообщение об ошибке:

[2012-03-22 21:43:25] ERROR NoMethodError: undefined method `each' for nil:NilClass 
/home/me/.rvm/gems/[email protected]_project/gems/activerecord-3.2.1/lib/active_record/associations/preloader/association.rb:88:in `associated_records_by_owner' 
org/jruby/RubyArray.java:1615:in `each' 
/home/me/.rvm/gems/[email protected]_project/gems/activerecord-3.2.1/lib/active_record/associations/preloader/association.rb:85:in `associated_records_by_owner' 
... 

Проблема может быть найдена в:

линии 88 и 89 в association.rb (github link):

... 
owner_key = record[association_key_name].to_s 

owners_map[owner_key].each do |owner| 
... 


Когда я пошагово в коде я вижу, что record[association_key_name] является BigDecimal, например 108,0, и когда применяется to_s, оно становится «108,0». Однако ключи в байтах owners_map ожидают «108» не «108,0»

association_key_name - это имя внешнего ключа в базе данных Oracle и определяется как тип Number. Первичный ключ также определяется как тип Number, но, как ни странно, он не разрешает BigDecimal.

Любые идеи? Это возможная ошибка? Или нужна ли точность в столбце базы данных?

System Info:
JRuby на Rails (3.2.1)
ActiveRecord JDBC Adapter
Oracle Database (с использованием представлений вместо таблиц)

+1

Да, как-то тип данных в Oracle имеет точность> 0. Если Rails сгенерировал столбец (определенный как целое число), то это, вероятно, ошибка Rails. Если таблица существовала с внешним ключом типа Number с точностью> 0, то это ошибка ... или, по крайней мере, проблема, ожидающая своего появления. На самом деле, я думаю, он больше не будет ждать :-). Я нашел это (в возрасте) с быстрым поиском google: http://blog.rayapps.com/2007/11/16/some-issues-with-oracle-views-as-activerecord-source/ –

+0

Спасибо за ссылку ! Я фактически использую представления для обертывания таблиц, поэтому я рассмотрю, как удалить точность. – ryan

ответ

2

Проблема связана с тем, что внешний ключ в базе данных было определено число с точностью. Спасибо tharrison за то, что указали мне this статью.

Я получил наш DBA, чтобы удалить точность на поле, и все сработало нормально. Конечно, мы находимся в удачном положении для создания нового продукта, где наша схема может быть легко изменена ...

+0

Проблема все еще преследует jRuby, Oracle JDBC с Rails 4.1.5. Кто-нибудь может найти патч для новых версий JDBC – carbonr