在Ruby中按字母顺序排序CSV文件

时间:2017-06-16 21:28:22

标签: arrays ruby csv sorting

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文件进行排序,但我不确定如何在循环之外这样做。所以,如果您有任何建议,请分享。

1 个答案:

答案 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