2

这是我想要实现的目标:

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 -- 等等 ...

我要做的与非常相似,尽管那里的实现对我不起作用。

我的控制器已经做到了这一点:

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}" %>or<%= "#{x.created_at}" %>等​​,我会得到正确的信息,一切都很好。

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

4

1 回答 1

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)
于 2013-07-28T02:23:06.313 回答