【问题标题】:grouping children by parent attribute按父属性分组子级
【发布时间】:2013-07-28 00:41:19
【问题描述】:

这是我想要达到的目标:

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 对象的列表。如果我打电话给&lt;%= "#{x.name}" %&gt;&lt;%= "#{x.created_at}" %&gt; 等,我会得到正确的信息,一切都很好。

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

【问题讨论】:

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


    【解决方案1】:

    我认为您需要像这样在@students_by_group 上使用group_by

    @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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      相关资源
      最近更新 更多