【问题标题】:Extend the Array returned from a query in Rails - Refactoring扩展 Rails 中查询返回的数组 - 重构
【发布时间】:2013-01-19 16:10:08
【问题描述】:

我想扩展从查询返回的 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 类并在那里添加方法,但它可能与其他模型无关......

有什么建议吗?

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 好的,这很好,但每次查询时都需要调用扩展。有什么方法可以在模型 Query 上设置它,以便在此模型上完成的每个查询都可以使用扩展方法?
    • @Rafal 在初始化器中扩展 Query 怎么样?它将应用于所有模型,但这是可以忽略不计的开销。示例见此处:stackoverflow.com/questions/2328984/…
    猜你喜欢
    • 2018-04-20
    • 2020-01-11
    • 2014-11-24
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    相关资源
    最近更新 更多