按父属性对子项进行分组

时间:2013-07-27 23:24:52

标签: ruby-on-rails arrays sorting ruby-on-rails-3.2 parent-child

这是我想要实现的目标:

Group_x.name

member1.name - member1.join_date - 等
  member2.name - member2.join_date - 等   ...

Group_y.name

member1.name - member1.join_date - 等
  member2.name - member2.join_date - 等   ...

我想要的是与this非常相似,尽管那里的实施对我不起作用。

我已经在我的控制器中走了这么远:

def index
  # https://stackoverflow.com/a/17835000/2128691
  @user_group_ids = current_user.student_groups.map(&:id)
  @students = Student.where('student_group_id IN (?)', @user_group_ids)
  # https://stackoverflow.com/a/10083791/2128691
  @students_by_group = @students.uniq {|s| s.student_group_id}
  @title = "All students"
end  

并在我的视图中调用以下内容 -

<% @students_by_group.all.each do |x| %>
  <p>
    <%= "#{x}" %>
  </p>
<% end %>   

给出了所有student个对象的列表。如果我拨打<%= "#{x.name}" %><%= "#{x.created_at}" %>等,我会得到正确的信息,一切都很棒。

但是现在我已经拥有了所有这些信息,我怎样才能将group.name(在我的代码中为x.student_group.name)作为该group_name为真的所有学生的标题?

1 个答案:

答案 0 :(得分:3)

我认为您需要在group_by上使用@students_by_group,如下所示:

@students_by_group = @students_by_group.group_by { |s| s.student_group }

这将返回一个散列,其中键是学生组对象,值是属于该组的学生,然后您可以在视图中执行此操作:

<% @students_by_group.each do |group, students| %>
  <h3><%= group.name %></h3>
  <% students.each do |x| %>
    <p>
      <%= "#{x}" %>
    </p>
  <% end %>
<% end %>

作为补充说明,group_by会针对每个学生触发查询,因此您可能需要为每个学生急切加载学生组,以获得一些性能提升:

@students = Student.where('student_group_id IN (?)', @user_group_ids).includes(:student_group)