У меня есть несколько объектов, которые связаны друг с другом, и я хотел бы разместить некоторые панели, чтобы показать их. Ради аргумента:Элегантное суммирование/группировка/Etc в Rails
- Publishing House - много книг
- Книга - имеет одного автора и от одного, и проходит через многие государства
- Publishing House Автор - писал много книг
Я хотел бы получить панель, которая сказала:
- Сколько книг издательство поставило в этом месяце?
- Сколько книг автор написал в этом месяце?
- В каком состоянии (в процессе, опубликовано) есть каждая из книг?
Для начала, я думаю, некоторые очень простой код:
@all_books = Books.find(:all, :joins => [:author, :publishing_house], :select => "books.*, authors.name, publishing_houses.name", :conditions => ["books.created_at > ?", @date])
Тогда я продолжу, чтобы пройти через каждый из субэлементов я хочу и суммарно их в новые массивы - как:
@ph_stats = {}
@all_books.map {|book| @ph_stats[book.publishing_house_id] = (@ph_stats[book.publishing_house_id] || 0) + 1 }
Это не очень рельсы, как - мысли?
Проблема заключается в том, что это приводит к тому, что может быть три раза по размеру sql-запросов. Я думаю, вопрос в том, лучше ли делать три запроса, подобные этому, или потянуть каждую возможную точку данных в массив (с помощью: включает), а затем проанализировать его позже? – aronchick
Пользовательский SQL, чтобы сделать именно то, что вы хотите, вероятно, лучше. Я считаю, что если вы боитесь запускать запрос несколько раз, вероятно, лучше кэшировать данные в столбце в соответствующей таблице и использовать либо триггер, либо обратный вызов для увеличения/декремент. –