2016-11-02 8 views
0

私はFooのコレクションを持っています。そのコレクションを繰り返し処理するクラスメソッドを作成し、そのコレクション内のすべてのオブジェクトに属性の値がある場合はtrueを返します。それ以外の場合、クラスメソッドはfalseを返します。Rails:モデルのクラスメソッド内でコレクションを繰り返す

私は次のことを試みたが、それは動作しません:

class Foo < ActiveRecord::Base 

    def self.all_have_number_value_999? 
    each do |foo_object| 
     return false if foo_object.number_val != 999 
    end 
    return true #all objects have #number_val == 999 
    end 

end 

は今、私は何とかFooオブジェクトのコレクションを得たと仮定します。私はFooオブジェクトのコレクションをどのように取得するのかを調整しますが、重要性はnumber_value_999?がそのコレクションを反復処理できることです。言い換えれば、いくつかの未知のスコープが、手前のFooオブジェクトのコレクションを生成しました。そのコレクションを繰り返し処理したいだけです a Fooクラスメソッド内です。

Foo.where(id: [123, 456]).all_have_number_value_999? 

コレクションを反復する方法がわからないため、クラスメソッドで不平を言っています。だから私の質問です:どのようにモデルのクラスメソッド内のコレクションを反復処理するのですか?

答えて

2

ロジックを逆にして、データベースに作業をさせます。それらのすべてがnumber_val999のを持っている場合は、それらのどれもない999あるnumber_valを持っていないし、これは簡単に表現される:単一かなり効率的なデータベースクエリになります

def self.all_have_number_value_999 
    !where.not(:number_val => 999).exists? 
end 

を。

これはクラスメソッドで、クラスのメソッドは(スコープはほとんどすべての後にクラスメソッドの具体的な種類があります)の関係に混入され、次のような関係や物事に対してこのメ​​ソッドを呼び出すことができますので:

Foo.where(id: [123, 456]).all_have_number_value_999? 

Foo.all_have_number_value_999?のように動作します。


あなたはデータベース外のコレクションを反復処理しながら、いくつかの任意のロジックを実行する場合は、あなたが反復する前に、クエリを解決するためにallコールに投げることができます:

def self.all_have_number_value_999? 
    all.each do |foo_object| 
    ... 
    end 
end 
+0

は、あなたの答えをありがとう。上記の私の更新された質問をご覧ください。私はもっ​​と説明的にしようとしました。あなたはここでは良い答えがありますが、私の質問がどんなものかをもっと詳しく説明したほうがはっきりと分かります。 – Neil

+0

最新のアップデートのようですか? –

関連する問題