1

入力フィールドに入力されたものを受け取り、入力時にその入力フィールドのすぐ下に表示する小さなアプリを作成しています。

このコードの私の目標は、6月1日に投稿されたすべてのものが1つの改行で投稿され、6月2日の最初のエントリと6月1日のエントリの間に2つのスペースがあるように、これらのエントリを日付で区切ることです。

これは私のコードであり、計画どおりに機能していませんが、理由がわかりません。3行目と私が間違って行っていることに起因していると思います。(注:これはまだ月または年の変更を考慮していないことを認識しています。適切な日付間隔がわかれば、それに到達します)

<% for i in (0..(@allLessons.count-1)) %>

<b><%= @date[i].created_at.strftime('%b %d')%></b><br/>

<% if @date[i].created_at.strftime('%d') == @date[i-1].created_at.strftime('%d') %>

<%= @date[i].created_at.strftime('%d') %> <br />

<% else %>

<%= @date[i].created_at.strftime('%d') %><br /><br />

<% end %>           
<% end %>

コントローラから:

@allLessons = Lesson.all
@date = Lesson.find(:all, :order => 'created_at ASC')

あなたがこれに貸すことができるどんな助けでも大いに感謝されるでしょう!

4

1 に答える 1

1

ブロックとイテレータはそれが存在する場所です。

@allLessons = Lesson.order('created_at ASC')
@dates = @allLessons.group_by { |lesson| lesson.created_at.beginning_of_day }.sort

<% @dates.each do |date, lessons| %>
  <% lessons.each do |lesson| %>
    <b><%= lesson.created_at.strftime("%d") %></b><br />
  <% end %>
  <br />
<% end %>

注釈付き

まず、すべてのレッスンをまとめます。これはfind(:all、:order =>'created_at ASC')と同等ですが、この新しいコンパクトな構文が好きです

@allLessons = Lesson.order('created_at ASC')

次に、それらをすべてハッシュにグループ化します。キーは日付で、値はその日に作成されたレコードの配列です。aを時刻がに設定されているaにbeginning_of_day変換します。だから、になります。これは、時間を邪魔することなく日付自体をグループ化できるようにするためです。DateTimeDate00:00:002012-05-25 18:002012-05-25 00:00:00

@dates = @allLessons.group_by { |lesson| lesson.created_at.beginning_of_day }.sort

@datesキーが日付で、値がその日付からのレッスンの配列であるハッシュになりました。例えば、{ '2012-05-24 00:00:00' => [ lesson_1 ], 2012-05-25 00:00:00' => [ lesson_2, lesson_3 ]

次に、ハッシュをブロックに渡します。ここで、キーは日付であり、値はレッスンの配列です。これは、各日付について...

<% @dates.each do |date, lessons| %>

その日に属するレッスンをください。そしてそれらのそれぞれのために...

  <% lessons.each do |lesson| %>

レッスンの日付を印刷する

    <b><%= lesson.created_at.strftime("%d") %></b><br />
  <% end %>

次の日付に進む前に、<br />

  <br />
<% end %>
于 2012-05-25T22:43:57.047 に答える