Фильтрация на уровне приложений / манипулирование данными - PullRequest
0 голосов
/ 26 июля 2010

У меня есть модель с множеством разных детей (has_many).

Мое приложение нуждается в большом количестве различных манипуляций с набором данных who. Поэтому получение данных из базы данных довольно просто, поэтому мне не нужно использовать области и средства поиска, НО я хочу делать с данными что-то, что эквивалентно:

named_scope :red, :conditions => { :colour => 'red' }
named_scope :since, lambda {|time| {:conditions => ["created_at > ?", time] }}

Должен ли я писать эквивалентные методы, которые просто манипулируют уже обработанными данными? Или в помощнике?

Просто нужна небольшая помощь, так как большинство вещей, которые я вижу, связаны с запросом к фактической базе данных для подмножества данных, когда мне потребуются все дочерние элементы этой одной модели, но я сделаю много разных визуализаций.

1 Ответ

0 голосов
/ 27 июля 2010

Так что, если я правильно понимаю, вы хотели бы запросить весь набор данных один раз, а затем выбрать из него различные наборы строк для различного использования.

Именованные области не будут выполнять кэширование,так как они строят отдельные запросы для каждого варианта.

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