如何对表格内容进行排序?

时间:2014-07-26 15:20:01

标签: ruby ruby-on-rails-4

enter image description here
在图片上,您可以看到绿线是分组(ed)_by和sort(ed),如下面的代码所示:
控制器:

class WelcomeController < ApplicationController
  def index
    if(current_user)
      @user_schedules = current_user.schedules
      @user_schedules_date = @user_schedules.group_by { |tables| tables.date }
    end
  end
end


查看:

<% @user_schedules_date.sort.each do |date, schedules| %>
  <tr class="thead success">
    <th colspan="4" scope="col"><p><%= date %></p></th>
  </tr>
  <% for schedule in schedules %>
    <tr>
      <th scope="row"><p><%= schedule.titel %></p></th>
      <td><p><%= schedule.time %></p></td>
      <td><p><%= schedule.location %></p></td>
    </tr>
  <% end %>
<% end %>


如何排序&#34;时间&#34;另外?

<小时/> 修改

数据库:

id;user_id;titel;location;time;date
1;"12";"Test";"Testort";"12:45:00";"01.01.2014"
2;"12";"Test2";"Testort2";"12:30:00";"01.01.2014"
3;"12";"Test3";"Testort3";"13:00:00";"02.01.2014"


<小时/> 的 EDIT2:

数据库更新:

id;user_id;titel;location;time;date;date_time
1;"12";"Test";"Testort";"12:45:00";"01.01.2014";"2014-01-01 00:00:00"
2;"12";"Test2";"Testort2";"12:30:00";"01.01.2014";"2014-01-01 01:00:00"
3;"12";"Test3";"Testort3";"13:00:00";"02.01.2014";"2014-02-01 00:00:00"
4;"21";"Test4";"Testort4";"Testzeit4";"Testdatum";"2014-03-01 00:00:00"

所以这很好用。

html表现在看起来像这样:
enter image description here

现在我必须了解如何分隔日期和时间,以及如何在灰线处对时间进行排序。

我不知道如何使用strftime - 方法。你说我应该在模型中实现它?
我在计划模型中试过这个:

def get_date
  return date_time.strftime("%d.%m.%Y");
end


我应该添加 view-code

<% @user_schedules_date.sort.each do |date_time, schedules| %>
  <tr class="thead success">
    <th colspan="4" scope="col"><p><%= date_time %></p></th>
  </tr>
  <% for schedule in schedules %>
    <tr>
      <th scope="row"><p><%= schedule.titel %></p></th>
      <td><p><%= schedule.time %></p></td>
      <td><p><%= schedule.location %></p></td>
    </tr>
  <% end %>
<% end %>

如果你能再次帮助我,那就好了 感谢。

1 个答案:

答案 0 :(得分:2)

您的time字段目前是一个字符串。这意味着,只需在sort字段中调用time就不会执行您想要的操作。相反,它将按字母数字排序排序。例如1:00 PM将在10:00 AM之前到来,因为:小于0

要解决此问题,您可以执行以下两项操作之一:

解析需要进行排序的时间,例如:

@user_schedules_date =
  @user_schedules.group_by(&:date)
    .each do |(_, grp)| 
      grp.sort_by! { |row| Time.parse(row.time) }
    end

(这是我推荐的)。将您的datetime合并为一个字段(让我们称之为date_time),类型为datetime。通过这种方式,Rails知道在将数据提供给您之前将其从数据库中获取的值包装在DateTime的实例中,并且知道将该值作为DATETIME字段存储在数据库中。

这很棒,因为它简化了您的分组和排序:

@user_schedules_date =
  @user_schedules.order(:date_time)
    .group_by { |sched| sched.date_time.beginning_of_day }

另外,排序(排序)是由数据库完成的,而不是在我们将它加载到Ruby的内存中之后,在大多数情况下,这是优选的。

编辑(回答问题中的修改)

  • 要从DateTime实例返回日期字符串,请执行以下操作date.strftime("%d.%m.%Y")
  • 同样,对于时间表,获取时间字符串的步骤如下:schedule.date_time.strftime('%T')