Так что, если я правильно понимаю, вы хотели бы запросить весь набор данных один раз, а затем выбрать из него различные наборы строк для различного использования.
Именованные области не будут выполнять кэширование,так как они строят отдельные запросы для каждого варианта.
Если вы хотите простой, вы можете просто запросить все строки (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