按日期分组和显示

时间:2010-12-28 13:09:16

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个rails应用程序,我想根据消息到达的时间向用户显示消息(消息)

每条消息(Message)都有一个名为created_at

的属性 例如,

- 20分钟前 ----- MESSAGE1 -----消息2

- 1小时前 ----- MESSAGE3 -----消息4 ----- MESSAGE5

- 2天前 ----- message6

依此类推。

我怎么能用rails做到这一点?

我正在使用rails 3 b.t.w

3 个答案:

答案 0 :(得分:1)

你基本上有两种选择。第一种是使用内置的Rails助手time_ago_in_words

# in your views
<%= time_ago_in_words(message.created_at) %>

您可以在Rails documentation中了解有关此帮助程序的更多信息。

这样做的缺点是它只适用于视图,而且可能不是完全正确的格式。如果是这种情况,您始终可以在初始化程序中定义自己的帮助程序。这是我为旧应用程序编写的一种方法,您应该能够根据自己的要求进行修改:

class ActiveSupport::TimeWithZone
  def how_long_ago
    seconds = (Time.now - self)

    # Keep adding days, weeks, months, years if necessary--same principle should apply
    if seconds > 3600
      (seconds / 3600).to_i.to_s + "h " + (seconds % 3600 / 60).to_i.to_s + "m"
    elsif seconds > 60
      (seconds / 60).to_i.to_s + "m " + (seconds % 60).to_i.to_s + "s"
    else
      seconds.to_i.to_s + "s"
    end
  end
end

Message.first.created_at.how_long_ago # => 3m 52s

要根据此分组数据,您可以在消息数组上使用group_by方法。

答案 1 :(得分:0)

您可以在消息模型中设置默认范围:

default_scope order('messages.created_at DESC')

答案 2 :(得分:0)

我在RailsCasts上找到了一个完美满足我需求的答案

http://railscasts.com/episodes/29-group-by-month