扩展从Rails中的查询返回的数组 - 重构

时间:2013-01-19 16:10:09

标签: ruby-on-rails ruby-on-rails-3 rails-activerecord

我想扩展从查询返回的Array以添加新方法。

假设我有一个模型查询,它有一些计算属性size_x,size_y ...

在我的控制器中,我检索了一些查询

@queries = Query.limit(10).all

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

@queries.average_size_x

@queries.average_size_y

我正在寻找一个简洁的解决方案,它将增强使用这两种方法返回的Array,而无需将其添加到全局Array类中。有没有办法做到这一点?

以下是我尝试的一些事情:

  • 重新定义self.find方法

仅当我将查询更改为旧语法时才有效

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

    Query.limit(10).extending(QueryAggregator)

如果我不调用all方法,因为该对象是ActiveRecord关系,但是一旦调用all,则方法average_size_x不可用。

我看到的唯一选择是扩展Array类并在那里添加方法,但它可能与其他模型无关......

有什么建议吗?

1 个答案:

答案 0 :(得分: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