2016-11-02 24 views
0

我有一个Foo对象的集合。我想要创建一个迭代该集合的类方法,并且如果该集合中的所有对象都具有某个属性的特定值,则返回true。否则,类方法返回falseRails:遍历模型类方法中的集合

我尝试以下,但它不工作:

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。我只是想遍历一个Foo类方法。

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

它在类方法中抱怨,因为它不知道如何遍历集合。所以这是我的问题:我如何迭代模型类方法中的集合?

回答

2

颠倒你的逻辑,让数据库完成工作。如果所有的人都999number_val然后他们都没有一个number_val999,这是简单地表示:

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

你的意思是像我最近的更新? –