Ruby Rails 3集合'sum'失败,出现TypeError
在示例Rails 3.2.8应用程序(在Ruby 1.9.3上)中,有以下简单设置:Ruby Rails 3集合'sum'失败,出现TypeError,ruby,ruby-on-rails-3.2,Ruby,Ruby On Rails 3.2,在示例Rails 3.2.8应用程序(在Ruby 1.9.3上)中,有以下简单设置: class Account < ActiveRecord::Base has_many :line_items def subtotal line_items.sum(&:price) end end class Line_Item < ActiveRecord::Base belongs_to :product def price product.
class Account < ActiveRecord::Base
has_many :line_items
def subtotal
line_items.sum(&:price)
end
end
class Line_Item < ActiveRecord::Base
belongs_to :product
def price
product.price * time
end
end
account = Account.new
account.line_items.build do |item|
item.years = 4
item.product = Product.last
end
account.subtotal
#=> TypeError: nil can't be coerced into BigDecimal
为什么
line\u items.sum(&:price)
的初始定义失败了?这似乎是Rails中的一个缺陷(至少在3.2.8中)
在Rails 3.2.8中,有许多关联是动态定义的。
虽然这并没有反映在
或它在“集合关联(一对多/多对多)”下的列表中简要列出
图表,但未再次引用
根据,它将始终尝试使用SQLsum
命中数据库。
但是,在此特定实例中,不会保存模型。所以什么都没有
在数据库中
所以要澄清一点:
account.line_items.sum(&:price) # Uses Collection#sum, goes to database
account.line_items.map.sum(&:price) # Uses Enumerable#map then Enumerable#sum
这已被记录在;这似乎与。价格返回的类型(类别)有关?行项目[0]。price.class?奇怪。我运行1.9.3和Rails 3.2.1,但它运行得很好。您确定所有记录都返回相同的类吗?也许循环一下价格,然后检查每个类。当我测试时,集合中只有一个项目。
account.line_items.sum(&:price) # Uses Collection#sum, goes to database
account.line_items.map.sum(&:price) # Uses Enumerable#map then Enumerable#sum