2012-01-18 3 views
0

Я недавно приключиться ошибку, когда я добавил следующее к моему environment.rb файла:Rails 3 - Добавление метода к классу Array, в 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 

Это прекрасно работает без метода суммы в среде .rb, поэтому я могу сделать @device.abilities как n НПУ, но когда метод сумма добавляется в environment.rb, я получаю следующее сообщение об ошибке при попытке сделать @device.abilities:

undefined method `zero?' for nil:NilClass 

Может кто-нибудь предложить, почему это происходит, и как я могу работать вокруг него? Я знаю, что я могу суммировать каждый массив вручную, но это не кажется очень рельсовым.

Спасибо!

+0

Чтобы суммировать поле экземпляра модели AR, Rails предоставляет http://ar.rubyonrails.org/classes/ActiveRecord/Calculations/ClassMethods.html#M000296, чтобы вы могли вместо того, чтобы добавлять сумму в массив? – microspino

+0

Также обратите внимание, что «массивы», возвращаемые из отношений AR, не являются массивами, хотя они утверждают, что они есть. –

ответ

1

сумма уже определена рельсами как Enumerable#sum, поэтому вам не нужно определять ее вообще.

Кроме того, я не думаю, что environment.rb - это подходящее место для размещения такого рода вещей. Вы должны создать новый файл инициализатора, если хотите расширить базовые классы. Ваш новый метод, вероятно, вмешивается в его версию.

Смежные вопросы