2017-06-16 75 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