时间:2010-07-26 13:35:53

标签: ruby-on-rails ruby

1 个答案:

答案 0 :(得分:0)

因此,如果我理解正确,您需要查询整个数据集一次,然后从中选择不同的行集以用于不同的用途。

命名范围不会执行任何缓存,因为它们正在为每个变体构建单独的查询。

如果你想要一个简单的,你可以只查询所有行(ActiveRecord将缓存相同查询的结果),然后你可以使用select来过滤行:

Article.all.select{|a| a.colour == 'red'}

或者,更进一步,您可以创建一个基于参数过滤行的常规方法:

def self.search(options)
  articles = Articles.all
  articles = articles.select{|a| a.color == 'red'} if options[:red]
  articles = articles.select{|a| a.created_at > options[:since]} if options[:since]
  articles
end

Article.search(:red => true, :since => 2.days.ago)

或者,如果你真的想保留范围提供的可链接方法语法,那么将你的过滤方法添加到Array类中:

class Array

  def red
    select.select{|a| a.colour == 'red'}
  end

end

或者,如果您只是不想将所有垃圾添加到每个Array对象,您可以将它们添加到对象中,但是您需要覆盖all方法并每次添加方法你创建行子集的时间:

def self.with_filters(articles)

  def articles.red
    Article.with_filters(select{|a| a.color == 'red'})
  end

  articles
end

def self.all
  self.with_filters(super)
end