【问题标题】:Is this a possible bug in 'activerecord-jdbc-adapter' when trying to eager load?尝试急切加载时,这是否是“activerecord-jdbc-adapter”中的一个可能错误?
【发布时间】:2012-03-22 22:15:58
【问题描述】:

我们有以下模型:

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/jruby-1.6.7@my_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/jruby-1.6.7@my_project/gems/activerecord-3.2.1/lib/active_record/associations/preloader/association.rb:85:in `associated_records_by_owner'
...

问题出在:

association.rb (github link) 中的第 88 行和第 89 行:

...
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。

有什么想法吗?这是一个可能的错误吗?还是需要更改数据库列的精度?

系统信息:
JRuby on Rails (3.2.1)
ActiveRecord JDBC 适配器
Oracle 数据库(使用视图而不是表)

【问题讨论】:

  • 是的,不知何故,Oracle 中的 Number 数据类型的精度 > 0。如果 Rails 生成列(定义为:integer),那么这可能是 Rails 错误。如果表存在的外键类型为 Number 且精度 > 0,那么这是一个错误……或者至少是一个等待发生的问题。其实我想它不会再等了:-)。我通过快速的谷歌搜索找到了这个(古老的):blog.rayapps.com/2007/11/16/…
  • 感谢您的链接!我实际上是在使用视图来包装表格,所以我会考虑去除精度。

标签: ruby-on-rails activerecord jdbc jruby jrubyonrails


【解决方案1】:

问题源于数据库上的外键被精确定义为数字。感谢tharrison 将我指向this 文章。

我让我们的 DBA 消除了现场的精确度,一切正常。当然,我们很幸运能够构建一个可以轻松更改架构的新产品......

【讨论】:

  • 问题仍然困扰着 jRuby,Oracle JDBC with Rails 4.1.5。有没有人为新版本的 JDBC 找到补丁
猜你喜欢
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多