如何group_by不同的属性?

时间:2016-02-13 20:42:11

标签: ruby-on-rails ruby

我正在尝试为@challenges创建时间表。对于那些有:deadline的挑战,我希望他们根据:deadline在时间轴上进行组织,对于那些有:date_started的挑战,我希望他们按照时间表排列他们的:date_started

如果质询有:deadline,则date_startednil,反之亦然。

例如

2016
  February
    CHALLENGE 1 (Deadline: 1st)
    CHALLENGE 2 (Date_Started: 3rd)
    CHALLENGE 3 (Deadline: 18th)

控制器

@challenges = current_user.challenges
@challenges_timeline = @challenges.group_by { |t| t.deadline.beginning_of_year + t.date_started.beginning_of_year }

视图

<% @challenges_timeline.sort.each do |year, challenges| %>
  <%= year.strftime('%Y') %>
  <% challenges.group_by { |t| t.deadline.beginning_of_month + t.date_started.beginning_of_month }.sort.each do |month, challenges| %>
    <%= month.strftime('%B') %>
    <% for challenge in challenges %>
      <% if challenge.deadline.present? %>
        <%= challenge.deadline %>:  <%= challenge.action %>
      <% end %>
      <% if challenge.date_started.present? %>
        <%= challenge.date_started %>:  <%= challenge.action %>
      <% end %>
    <% end %>
  <% end %>
<% end %>

1 个答案:

答案 0 :(得分:0)

  1. 更改架构:
  2. 如果两个日期相互否定,也许您应该只有一个日期字段,另一个字段用于显示日期是开始还是结束。这将允许您在数据库级别进行分组,从而节省一些处理时间。

    1. 添加实例方法
    2. 一个简单的实例方法,例如

      def timeline_date
        deadline || date_started
      end
      

      允许简单分组,例如

      challenges.group_by { |c| c.timeline_date.beginning_of_month }
      
      1. 直接在||块中使用group_by