2011-01-30 9 views
4

私は、オブジェクトのコレクションを操作するいくつかのメソッドを作成しようとしています。コレクションのカスタムメソッドを作成する

私は私のコントローラで私が持っているコンフィギュレーションモデルで

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は1つの構成オブジェクトだけでなく、構成の配列なので、これが起こっているようです。 同じアプローチを1つのConfigurationオブジェクトで試したところ、うまくいきましたが、このバージョンではうまくいきません。

この「カスタム」ライブラリのメソッドをデフォルトの配列アーゼルに追加するにはどうすればよいですか?

上記のメソッドはテストであり、私は何をする必要があるのか​​、コードは問題ではありませんが、エラーをスローする前にRailsがそこを見ていません。

ありがとうございました!

答えて

4

Arrayなどのコレクションクラスに含まれ、 'any?'などのメソッドを定義するEnumerableモジュールを拡張することができます。と '収集'。たとえば、:

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メソッドが追加されるようになりました。したがって、そのメソッドはどのタイプでもうまく再生できるようにコーディングする必要があります。

+0

素晴らしい!美しく動作します。 – Lievcin

+0

実際には、Enumerableモジュールがどのように動作するのかについて私の答えで実際には間違っていました( 'each'は実際にEnumerableを含むクラスによって定義されています - つまりArrayとHashは 'each'を定義し、Enumerableは 'map' )。私はそれを修正します。 –

+1

これを特定のモデルに接続する方法はありますか?例えば、私がA.allをしたら、そのコレクションに新しいメソッドを持たせたいのですが、B.allにメソッドを含めるべきではありません。このソリューションは、Enumerableから継承したものにdo_somethingを追加します。私は特定のインスタンスのためだけにそれをしたい。 –

関連する問題