答案 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