2011-09-12 17 views
0

カレンダーを使用するアプリケーションがあり、ログイン時にカレンダーの概要を提供したいと思います。Rails:属性に基づいて部分的にグループ化する

のイベント:

今日

  • イベント1

明日それが今日、明日、そして今週のイベントを示して要約は次のように、フォーマットする必要があります

  • イベント2
  • イベント3
  • イベント4

今週

  • イベント5
  • イベント6
  • イベント7
  • イベント8

パーシャルは、日付に基づいて適切な方法でグループ化されるようにレンダリングするにはどうすればよいですか?

答えて

0

最初のものは含まれていますモデル法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)

デフォルト '週' は日曜日です月曜日まで別の日を希望する場合はオフセットを追加します。金曜日に

月曜日はEventと呼ばれるモデルを仮定すると

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

0

あり、それはdate属性を持っており、これらのコレクションがここ1つのアイデアだ、@eventsと呼ばれる:あなたのビューでこれを入れて... 。

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

...その後、あなたはこのようになりますその_event.html.erbと呼ばれる部分だろう:

をhapping何
<% 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 %> 

たちはeventsと呼ばれるローカルとして全体@eventsコレクションに渡していrenderコールです。その部分の内部では、自動的に生成されたevent_counterメソッドを使用して、コレクションの前の(events[event_counter - 1])イベントと次の(events[event_counter + 1])イベントを検索します。そして、現在のeventの日付が(それがその日の最初の一つだという意味)last_eventの日付と異なる場合(私たちは、新しい日付の見出しと新しいセットを開始し、eventの日付がnext_eventの日付と異なる場合すなわち、それは我々がセットに終了)その日の最後の一つです。

それは少し醜いだし、確かにそれを行うにはよりエレガントな方法がありますが、それは仕事を取得します。

関連する問題