【发布时间】: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