2009-07-17 102 views
6

无法找出这一个。 在rails模型中,我想调用同一模型中的一个方法来操作find方法返回的数据。这个'过滤器'方法将在这个模型中被许多自定义的查找方法调用,所以我希望它是分开的。 (我不能从SQL过滤实在是太复杂)轨道:模型内的呼叫方法

下面是一个例子:

#controller 
@data = Model.find_current 

#model 
class Model 
    def self.find_current 
    @rows = find(:all) 
    filter_my_rows 
    return @rows 
    end 

    def filter_my_rows 
    #do stuff here on @rows 
    for row in @rows 
     #basically I remove rows that do not meet certain conditions 
    end 
    end 
end 

的结果是这样的:未定义的方法`filter_my_rows'

感谢您的帮助!

回答

4

问题的一部分是你定义了一个名为find_current的类方法和一个名为filter_my_rows的实例方法。一般来说,你可以在同一个范围内定义它们,以便它们一起工作。

另一件事是你可以做一个很简单的Array#拒绝调用你需要的很多过滤。例如:

@models = all.reject do |m| 
    # This block is used to remove entries that do not qualify 
    # by having this evaluate to true. 
    !m.current 
end 

可以一定程度上被按要求,太堵功能模块化这一点,但能得到广泛复杂,如果你不小心管理。

# Define reusable blocks that are organized into a Hash 
CONDITION_FILTERS = { 
    :current => lambda { |m| m.current } 
} 

# Array#select is the inverse of Array#reject 
@models = all.select(CONDITION_FILTERS[:current]) 

当你在你的问题说这是唯一需要的,因为有关无法确定所有的记录从数据库加载之前特定记录的相关性的问题,这是因为你通常不好的形式可能会拒绝大量的数据,而这些数据通过检索和实例化仅作为模型立即丢弃它们的麻烦。

如果可能,您至少应该在请求期间缓存检索到的行,这样您就不必一遍又一遍地抓取它们。

2

使用named_scope代替

named_scope :current, :conditions => {:active => true} # this is normal find criteria 

然后在你的控制器

@date = Model.current 

还可以使named_scopes lambda函数

+1

谢谢,但我认为不能使用范围或任何条件筛选的SQL,因为我需要检查的条件来自不同的数据库(不同的服务器上)的数据。所以我必须循环它们,并逐一检查它们是否属于belongs_to协会本身。 – mickey 2009-07-17 14:05:41

0

有什么不对您的解决方案?你在找什么? 如果我明白你的观点,你的执行的主要问题是

This 'filter' method will be called from many custom find method within this model, so I want it to be separate.

...你不能使用named_scopes或with_scope,这使我想到的第一方案是创建一个自定义包装来充当过滤器。

class Model 
    def self.find_current 
    filtered do 
     all 
    end 
    end 

    def self.other_method 
    filtered do 
     all :conditions => { :foo => "bar" } 
    end 
    end 

    def self.filtered(&block) 
    records = yield 
    # do something with records 
    records 
    end 

end 
+0

我的方法有什么问题是它给了我这个错误:未定义的方法`filter_my_rows'。就好像它无法弄清楚我试图从内部调用一种方法。 你的方法也给了我同样的错误:undefined method`filtered' – mickey 2009-07-17 15:27:26

+0

我修正了错误。该方法应该是self.filtered。 – 2009-07-18 11:01:18

3

实例的类和函数的功能是你的问题。

你不能以这种方式在你的类函数中调用一个实例函数。

使用self.filter_my_rows来定义你的功能(注意self),一切都会正确。