如何在Ruby On Rails中按开始时间和结束时间之间的范围日期进行分组?

时间:2016-02-14 15:03:47

标签: ruby-on-rails ruby

我尝试创建日历列表​​

迁移:

class CreateCalendars < ActiveRecord::Migration
  def change
    create_table :calendars do |t|
      t.string :title
      t.text :description
      t.datetime :start_time
      t.datetime :end_time

      t.timestamps null: false
    end
  end
end

查看:

<% @dates.each do |day, posts| %>
 <%for daytime in day%>
  <h4 class="other_day_title"><%= daytime %></h4>
  <% posts.each do |post| %>
   <p class="post_title">。<%= post.title %></p>
  <%end%>
 <%end%>
<%end%>

控制器:

def index
@posts = Post.all.order(:start_time)
@date = params[:month] ? Date.parse(params[:month]) : Date.today
@dates = @posts.group_by {|t| t.start_time.to_date..t.end_time.to_date}
end

输出结果为:

enter image description here

两个帖子重叠

我该如何显示:

2016年2月9日

  • TEST1

2016年2月10日

  • TEST1
  • TEST2

2016年2月11日

  • TEST1
  • TEST2

2016年2月12日

  • TEST1
  • TEST2

2 个答案:

答案 0 :(得分:1)

在您的控制器中:

@dates = @posts.map { |post| (post.start_time.to_date..post.end_time.to_date).to_a }.flatten.uniq

然后,在您看来:

<% @dates.each do |day| %>
  <h4 class="other_day_title"><%= day %></h4>
  <% @posts.select { |post| ((post.start_time.to_date..post.end_time.to_date).to_a).include? day }.each do |post| %>
    <p class="post_title">。<%= post.title %></p>
  <%end%>
<%end%>

由于@dates现在只有日期,因此您将遍历这些日期。然后,对于每个帖子,您选择当天在start_time.to_date..end_time.to_date范围内的每个帖子,以便列出该日期发生的每个帖子。

修改 @dates现在包含任何给定对象的start_time.to_date..end_time.to_date范围内的每个日期。然后它展平数组并仅选择唯一元素,迭代视图中的那些元素。

答案 1 :(得分:0)

我认为group并不是你想要达到的目标。怎么样这样做:

@dates =  @posts.each_with_object({}) do |post, acc|
  (post.start_date..post.end_date).each do |date|
    (acc[date] ||= []) << post
  end
end