我最近在environment.rb文件中添加以下内容时遇到了一个错误:
class Array
def sum
self.inject{|sum,x| sum + x }
end
end
允许我执行array.sum的预期方法非常有效,但当我试图通过给定的对象has_many
关系访问对象时,它导致了一个奇怪的错误,例如:
class Device < ActiveRecord::Base
attr_accessible :name, :device_abilities, :abilities
has_many :device_abilities, :dependent => :destroy
has_many :abilities, :through => :device_abilities, :dependent => :destroy
end
class Ability < ActiveRecord::Base
attr_accessible :name, :device_abilities, :devices
has_many :device_abilities, :dependent => :destroy
has_many :devices, :through => :device_abilities, :dependent => :destroy
end
class DeviceAbility < ActiveRecord::Base
attr_accessible :device_id, :ability_id
belongs_to :device
belongs_to :ability
end
在environment.rb中没有sum方法的情况下,这很好,所以我可以像往常一样执行@device.abilities
,但当在environment.rb中添加sum方法时,我在尝试执行@device.abilities
时会出现以下错误:
undefined method `zero?' for nil:NilClass
有人能提出为什么会发生这种情况,以及我如何解决它吗?我知道我可以手动求和每个数组,但这似乎不是很像rails风格。
谢谢!
sum已经被rails定义为Enumerable#sum,所以您根本不应该定义它。
此外,我认为environment.rb不是放置这种东西的合适位置。如果要扩展基类,则应该创建一个新的初始值设定项文件。您的新方法可能会干扰rails版本。