按日期分组通过集合的子项

时间:2013-10-25 23:21:55

标签: ruby-on-rails

我有以下内容:

目标和日志条目。

目标有自己的一组日志条目。

我进了4球。

@goals = @user.goals.where(name: Goal::DIET_NAMES)

卡路里,碳水化合物,脂肪和蛋白质。

我想为每个目标提取所有日志条目,然后按日期对它们进行分组,这样我就可以在这样的表格中显示它们:

Table of macros

如何迭代每个目标,然后按日期对所有日志条目进行分组,然后在视图中呈现?


现在我只能理解如何遍历每个目标日志条目,但之后我将无法为每个目标类型显示分组行。对于每个目标,它看起来像一个单独的表。相反,我想为每个目标的日期条目创建一个行。

编辑:这是一种讨厌的方式,我在那里中途:

  @log_entries = []
  @goals.each do |goal|
    @log_entries << goal.log_entries
  end
  @log_entries.flatten!

我不确定如何按日期分组?目标是按日期对所有log_entries进行分组,以便每个日期匹配的日期可以是一行。

1 个答案:

答案 0 :(得分:1)

试试这个:

@goals = @user.goals.where(name: Goal::DIET_NAMES).includes(:log_entries)
# using includes to eager load the log entries (not necessary but optimizes db queries)

@log_entries = @goals.flat_map(&:log_entries).
                      group_by{|x| x.created_at.to_date}
# returns an Array of hashes where
# key is the created date 
# value is an Array of log entries for that date
# E.g. [{created_date1 => [log1,log2..]}, {created_date2 => [log3,..]}..]

# In view 
<%= @log_entries.each do |date, logs| %>
   #here logs is an array of log entries for the date
<% end %>