我尝试创建日历列表
迁移:
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
输出结果为:
两个帖子重叠
我该如何显示:
2016年2月9日
2016年2月10日
2016年2月11日
2016年2月12日
答案 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