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文件中。然后,循环移动到下一个用户。
然而,问题是用户没有按字母顺序输入。我通常会使用以下代码按字母顺序对数组进行排序。
row.sort_by! {|student| [student.last_name, student.firstname]}
但看到这将是无效的,因为我一直在寻找另一个解决方案。按字母顺序对数据进行排序的另一种方法是什么?从我所看到的情况来看,我不太可能在循环中对CSV文件进行排序,但我不确定如何在循环之外这样做。所以,如果您有任何建议,请分享。
答案 0 :(得分: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