Rails: Показать записи по месяцам в представлении, как-то иначе?

СЦЕНАРИЙ: у меня есть куча спичек. Я хочу создать, на мой взгляд, боковой столбец с HTML-ссылками, где вы можете просматривать совпадения по месяцам. Вот моя текущая реализация:

ТЕКУЩЕЕ РЕШЕНИЕ:

#Controller
@matches_by_month = Match.find(:all).group_by {|match| match.kickoff.strftime('%B %Y')}

#View
<%  @matches_by_month.each do | month, matches | %>
<%=link_to month %><br>
<% end %>

# Returns in the side column links that look like this.
# April 2011
# May 2011
# Which is great!

ПРОШУ СОВЕТА: я думаю, что это не очень хорошее решение, потому что со временем эта страница будет работать медленнее. Верно? К 2013 году у меня может быть 1 500 записей, и мне кажется бесполезным постоянно находить (:все) совпадения, чтобы получить месяцы. Есть ли другое решение, которое я могу использовать? Должен ли я вести отдельную таблицу вне «совпадений», в которой отслеживаются месяцы. Может быть, я слишком много думаю об этом, и текущее решение в порядке. Мысли?


person alenm    schedule 05.05.2011    source источник


Ответы (1)


Если можно с уверенностью предположить, что каждый месяц между первой записью и последней записью есть совпадения, вы можете:

# for your sidebar
start_date = Match.first.kickoff.to_date
end_date = Match.last.kickoff.to_date

<% start_date.step(end_date, 1.month) do |date| %>
  <%= link_to date.strftime('%%B %Y'), matches_by_month_path(date) %>
<% end %>

А затем в вашем контроллере просто проанализируйте выбранную дату и выполните условный поиск, используя Match.where(...).

person coreyward    schedule 06.05.2011
comment
По какой-то причине метод step генерирует ошибку. Я пробую ваше решение и получаю следующую ошибку. неопределенный метод `шаг' для 2011-04-02 12:45:00 UTC:Время - person alenm; 06.05.2011
comment
Time не имеет метода step. Просто конвертируйте их в даты. Я обновил ответ, чтобы отразить это. - person coreyward; 06.05.2011
comment
Это исправило это, и это решение отлично, пока у меня есть совпадения каждый месяц. НО, если у меня нет матчей каждый месяц (т. е. в межсезонье), можно ли с уверенностью сказать, что мое первое решение — это то, что мне нужно использовать? - person alenm; 06.05.2011
comment
@neuone Возможно, да. Если вы используете memcache для кэширования результата БД, то даже с 1500+ строками все будет в порядке. Вместо этого вы можете использовать функции SQL для получения месяцев из сообщений. Это намного быстрее, особенно если эти столбцы проиндексированы. - person coreyward; 06.05.2011
comment
Я рассмотрю кэш памяти и то, как может выглядеть оператор SQLite3. Спасибо за понимание. - person alenm; 06.05.2011