2013-01-19 24 views
0

我想扩展查询返回的数组以添加新方法。在Rails中扩展从查询返回的数组 - 重构

让我们假设我有一个模型查询和它有几个属性计算size_x,size_y ...

在我的控制,我找回了几个疑问

@queries = Query.limit(10).all 

现在@queries成为一个数组。我想有2种方法

@queries.average_size_x 

而且

@queries.average_size_y 

我找了一个整洁的解决方案,将增强阵列与2种方法返回而不将其添加到全局Array类扩展Array 。有没有办法做到这一点?

这里有一些事情我想:

  • 重新定义self.find方法,如果

这只能更改我的查询到旧的语法

Query.find(:all, :limit => 5) 
  • 扩展关系

    Query.limit(10).extending(QueryAggregator)

这工作,如果我不叫all方法的对象是一个ActiveRecord关系,但一旦all被调用时,方法average_size_x不可用。

我看到的唯一的选择是扩展Array类,并添加方法出现,但也可能是不相关的其他型号...

有什么建议?

回答

1

这应该起作用。您有一个代理实例并通过模块进行扩展。

query = Query.limit(10).all 

module SomeModule 
    def average_size_x 
    end 

    def average_size_y 
    end 
end 

query.extend(SomeModule) 

query.average_size_y 
query.average_size_y 
+0

好的,这是好的,但需要调用扩展每次我做一个查询。可以在模型Query上设置此方法,以便在此模型上完成的每个查询都可以使用扩展方法? – Rafal

+1

@Rafal在初始化程序中如何扩展Query?它将应用于所有模型,但这是可以忽略的开销。看到这里的例子:http://stackoverflow.com/questions/2328984/rails-extending-activerecordbase –