2017-06-16 60 views
0
self.students.includes(:events).each do |student| 
    row = [] 
    row.push student.first_name 
    row.push student.last_name 
    row.push student.title 
    row.push student.id 
    csv << row 
end 

截至目前,使用行数组一次一行地将每个用户的数据输入到CSV文件中。之后,循环移动到下一个用户。在Ruby中按字母顺序排序CSV文件

但是,问题在于用户没有按字母顺序输入。我通常会使用下面的代码按字母顺序对数组进行排序。

row.sort_by! {|student| [student.last_name, student.firstname]} 

但看到这将是无效的,因为只有一行将被排序在一次我正在寻找另一个解决方案。按字母顺序排列数据的另一种方法是什么?从我所看到的情况来看,我不可能在循环中对CSV文件进行排序,但我不确定如何在循环之外这样做。所以,如果您有任何建议,请分享。

+0

'self.students.includes(:events)'的结果是什么。我期望一个Enumerable,那么你对_since的期待只会在一个时间点排序,这将是错误的。你可以尝试'self.students.includes(:events).sort_by {| student | [student.last_name,student.firstname]}。每个...' – knut

+0

非常感谢,这个解决方案做到了! – Jalen929

回答

4

如何排序学生第一?

self.students 
.includes(:events) 
.sort_by { |s| [s.last_name, s.firstname] } 
.each do |student| 
    csv << [ 
     student.first_name, 
     student.last_name, 
     student.title, 
     student.id, 
    ] 
end 

但是从我看到的self.students了可能是ActiveRecord查询,这样的话,使用DB为什么不排序呢?

self.students 
.includes(:events) 
.order(last_name: :asc, first_name: :asc) 
.each do |student| 
    csv << [ 
     student.first_name, 
     student.last_name, 
     student.title, 
     student.id, 
    ] 
end 

但是,这仍然是错误的,因为你可以有太多的结果装入内存一次,所以不是你应该使用#find_each将分批加载数据:

self.students 
.includes(:events) 
.order(last_name: :asc, first_name: :asc) 
.find_each do |student| 
    csv << [ 
     student.first_name, 
     student.last_name, 
     student.title, 
     student.id, 
    ] 
end 

但是,为什么不改善它,因为你不需要其余的领域,最好只选择你所需要的,所以:

self.students 
.includes(:events) 
.order(last_name: :asc, first_name: :asc) 
.select(:first_name, :last_name, :title, :id) 
.find_each do |student| 
    csv << [ 
     student.first_name, 
     student.last_name, 
     student.title, 
     student.id, 
    ] 
end