Создание собственного метода для коллекции - PullRequest
4 голосов
/ 30 января 2011

Я пытаюсь создать несколько методов для управления коллекциями объектов.

В моем контроллере есть следующее утверждение

  def show
    @big = Configuration.find(params[:id]).elements
    @custombig = @big.getchanged
  end

В модели конфигурации у меня есть:

require 'lib/validation_rules'
class Configuration < ActiveRecord::Base
  include ValidationRules

и в моей папке lib есть файл validation_rules:

module ValidationRules
  def getchanged()
    names =[]
    self.each do |pp|
      names << pp.name
      return names
    end
  end
end

Идея проста. Та же модель будет нуждаться во многих правилах конфигурации, которые я хочу исключить из контроллера и модели (когда я говорю много, я имею в виду около 200).

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

Как я могу получить рельсы для добавления этой "пользовательской" библиотеки методов в арсенал Array по умолчанию?

Напомним, что приведенный выше метод является всего лишь тестом, и не совсем то, что мне нужно сделать, то, что делает код, не является проблемой, но Rails даже не смотрит туда, прежде чем выдает ошибку.

Большое спасибо за вашу помощь!

1 Ответ

4 голосов
/ 30 января 2011

Вы можете расширить модуль Enumerable, который включен в классы коллекции, такие как Array, и который определяет методы, такие как 'any?'и «собирать».Например:

module Enumerable
  def do_something
    self.each do |item|
      yield(item)
    end
  end
end

letters = ['a', 'b', 'c']
letters.do_something { |letter| p letter }

Мой метод do_something на самом деле ничего не делает - вызывать его - все равно что вызывать 'each'.Но, конечно, вы можете добавить в него свою логику для достижения желаемого результата.

Имейте в виду, что все, что включает в себя 'Enumerable', теперь будет иметь метод do_something, так что этот метод должен быть закодирован, чтобы хорошо играть с любым типом.

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