在Ruby中按字母顺序排序CSV文件
问题描述:
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文件进行排序,但我不确定如何在循环之外这样做。所以,如果您有任何建议,请分享。
答
如何排序学生第一?
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
'self.students.includes(:events)'的结果是什么。我期望一个Enumerable,那么你对_since的期待只会在一个时间点排序,这将是错误的。你可以尝试'self.students.includes(:events).sort_by {| student | [student.last_name,student.firstname]}。每个...' – knut
非常感谢,这个解决方案做到了! – Jalen929