Rails: группировка паролей на основе атрибута - PullRequest
0 голосов
/ 12 сентября 2011

У меня есть приложение, которое использует календарь, и я хотел бы предоставить сводку календаря при входе в систему. Сводка должна быть отформатирована таким образом, чтобы отображать события на сегодня, завтра и на этой неделе, например:

События для:

Сегодня

  • Событие 1

Завтра

  • Событие 2
  • Событие 3
  • Событие 4

на этой неделе

  • Событие 5
  • Событие 6
  • Событие 7
  • Событие 8

Как отобразить партиалы так, чтобы они были правильно сгруппированы по дате?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2011

Предположим, ваша модель называется Event, и у нее есть атрибут date, а ваша коллекция называется @events, вот одна из идей: представьте это на ваш взгляд ...

<ul>
<%= render @events, locals: { events: @events } %>
</ul>

... тогда у вас будет партиал с именем _event.html.erb, который выглядит следующим образом:

<%  last_event = event_counter == 0 ? nil : events[event_counter - 1]
    next_event = events[event_counter + 1]
%>
<%  if last_event && last_event.date != event.date
    # add a new date header and start a new nested list of events
%>
  <li><h3><%= event.date %></h3>
    <ul>
<% end %>

      <li><%= link_to event %></li>

<%  if next_event && next_event.date != event.date
    # end the nested list and make way for the next date header and set of events
%>
    </ul>
  </li>
<%  end %>

Что происходит в вызове render, который мы передаем во всей коллекции @events какместный житель под названием events.Затем внутри партиала мы используем автоматически сгенерированный метод event_counter для поиска предыдущих (events[event_counter - 1]) и следующих (events[event_counter + 1]) событий в коллекции.Затем, если дата текущего event отличается от даты last_event (имеется в виду, что она является первой для этой даты), мы начинаем новый набор с новым заголовком даты, и если дата event отличаетсяс даты next_event (т. е. она является последней на эту дату), мы заканчиваем набор.

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

0 голосов
/ 12 сентября 2011

Сначала можно добавить метод модели for_dates (start_date, end_date), который будет содержать: where([:date_column >= ? and :date_column <= ?, start_date, end_date])

Тогда используйте:

Model.for_dates(Date.today, Date.today)

Model.for_dates(Date.today+1, Date.today+1)

По умолчанию «неделя» - с воскресенья по понедельник. Добавьте смещение, если вы хотите разные дни, например

с понедельника по пятницу

Model.for_dates(Date.today.beginning_of_week+1, Date.today.end_of_week+1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...