Расширение Enumerable в Rails 3 - PullRequest
2 голосов
/ 12 марта 2011

ОБНОВЛЕНИЕ К ВОПРОСУ
Вот что я сделал, основываясь на некоторых исследованиях и выводах.

ШАГ 1 - у меня есть этот модуль в моих Rails3 проект и поместите его в мою папку lib

# lib/enumerable.rb
module Enumerable
   def sum
      return self.inject(0){|acc,i|acc +i}
   end

   def average
      return self.sum/self.length.to_f
   end

   def sample_variance 
       avg=self.average
       sum=self.inject(0){|acc,i|acc +(i-avg)**2}
       return(1/self.length.to_f*sum)
   end

   def standard_deviation
       return Math.sqrt(self.sample_variance)
   end

end

ШАГ 2 - Согласно этой статье блога , в Rails 3 ваша папка lib не будет загружаться автоматически,Чтобы загрузить этот модуль, вам нужно перейти к вашему config / application.rb и ввести его:

config.autoload_paths += %W(#{config.root}/lib)

ШАГ 3 - Тогда в вашей модели, насколько я понимаю, вы вводите это вполучить модуль.

class MyModel < ActiveRecord::Base
    include Enumerable
end

ШАГ 4 - Затем я пытаюсь перезапустить сервер rails и попробовать это, и я получаю false, когда я ожидаю, что это правда.

MyModel.respond_to?('sample_variance')
# false, when it should be true

Что я делаю не так?Разве я не должен быть правдой?

Ответы [ 3 ]

2 голосов
/ 04 декабря 2011

Ваше включение основного модуля Enumerable (не вашего расширения), несомненно, сработало, и вы можете проверить его, просто проверив любой из методов, которые были включены в него. Проблема в том, что ваш «Include Enumerable», возможно, не включал вашфайл, а точнее основной модуль.

Одно из предложений - переименовать имя файла для вашего расширения и загрузить его через инициализатор с

require 'my_enumerable.rb'

. Таким образом, вы точно получите и Enumerable, и ваше расширение для Enumerable..

0 голосов
/ 12 марта 2011

Вы можете посмотреть на это:

http://www.ruby -doc.org / docs / ProgrammingRuby / html / tut_modules.html

Вы можетевключите модуль в класс и тем самым сделайте методы этого модуля доступными для этого класса.

Если вы включите Enumerable в модель Rails, то его методы будут доступны для этой модели.Но так как методы Enumerable уже доступны для определенных типов объектов в вашем Rails-проекте, и эти объекты доступны для создания экземпляров из вашей модели, я не понимаю, почему вы можете это сделать, потому что методы Enumerable отлично работают дляцели, для которых они были спроектированы.

В любом случае, вы можете обнаружить, что вам может подойти одно из следующих действий:

- использовать метод суммы Activerecord

- преобразовать ваш объект вмассив, и используйте метод суммы Enumerable

- напишите свой собственный метод, но не называйте его sum, потому что вы не хотите путать себя.

Попробуйте закомментировать второйПоявление модуля Neuone в следующем фрагменте, и посмотрим, что произойдет.Затем попробуйте закомментировать метод Charlie.one и посмотрите, что произойдет.

module Neuone
def one
  'neuone one'
end 

def two
  'neuone two'
end

end

module Neuone
def two
  'neuone two two'
end

end

Класс Чарли включает Neuone

def one
    'charlie one'
end

end

c = Charlie.new p c.one p c.two

0 голосов
/ 12 марта 2011

Если я понимаю, к чему вы клоните, вы пытаетесь использовать метод суммы Enumerable в ActiveRecord.Вы можете сделать это, преобразовав текущий объект в массив, а затем вызвав метод суммы Enumerable для этого массива.

Еще одна вещь: вам не нужно использовать return, как вы его используете.Ruby вернет последнюю рассчитанную вещь из вашего метода.Вам также не нужно использовать self таким образом - в Ruby self является текущим объектом.

Так что если у вас есть метод:

def charlie
  inject{|i, j| i + j + 1}
end

, и вы вызываете его так:

(1..2).charlie

self - текущий объект (1..2).

Выход будет 4, без self или return.

Я очень рекомендую Дейва Томаса«Я читал лекцию по метапрограммированию в Ruby, но не смог, она где-то в сети.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...