解析和间隔date / fixnum对象时遇到问题

时间:2012-05-25 22:39:04

标签: ruby-on-rails ruby loops

我正在构建一个小应用程序,它将输入的内容输入到输入字段中,并在输入时直接显示在输入字段下方。

我使用此代码的目标是按日期分隔这些条目,以便在6月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')

您可以借此给予任何帮助,我们将非常感激!

1 个答案:

答案 0 :(得分: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 %>

<强>带注释

首先,我们将所有课程结合在一起。这相当于找到(:all,:order =&gt;'created_at ASC'),但我喜欢这种更新,更紧凑的语法

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

然后我们将它们组合成一个散列,其中键是日期,值是当天创建的记录数组。 beginning_of_day会将DateTime转换为Date,其中时间设置为00:00:00。因此,2012-05-25 18:00变为2012-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 %>