2017-06-16 4 views
0

Ab sofort werden die Daten jedes Benutzers mit dem Zeilenarray Zeile für Zeile in die CSV-Datei eingegeben. Danach geht die Schleife weiter zum nächsten Benutzer.CSV-Datei in Ruby alphabetisch sortieren

Das Problem ist jedoch, dass die Benutzer nicht alphabetisch eingegeben werden. Normalerweise würde ich den folgenden Code verwenden, um ein Array alphabetisch zu sortieren.

Aber sehen, wie dies ineffektiv wäre, da nur eine Zeile zu einer Zeit sortiert werden würde, suche ich nach einer anderen Lösung. Was ist eine andere Möglichkeit, die Daten alphabetisch in die CSV-Datei zu sortieren? Von dem, was ich gesehen habe, ist es unwahrscheinlich, dass ich in der Lage wäre, die CSV-Datei in der Schleife zu sortieren, aber ich bin unsicher, wie das außerhalb der Schleife zu tun ist. Also, wenn Sie irgendwelche Vorschläge haben, teilen Sie bitte.

+0

Was ist das Ergebnis von 'self.students.includes (: events)'. Ich würde ein Enumerable erwarten, dann würde Ihre Erwartung, dass nur eine Zeile zu einem Zeitpunkt sortiert wäre, falsch sein. Sie könnten versuchen, 'self.students.includes (: events) .sort_by {| student | [student.last_name, student.firstname]}. jeder ... ' – knut

+0

Vielen Dank, diese Lösung hat es geschafft! – Jalen929

Antwort

4

Was ist mit der Sortierung der Schüler zuerst?

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 

jedoch von dem, was ich sehe, self.students ist wahrscheinlich ActiveRecord Abfrage, so dann, warum es nicht sortieren DB verwenden?

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 

Aber das ist immer noch falsch, wie Sie zu viel Ergebnisse haben in den Speicher passen auf einmal, so stattdessen sollten Sie #find_each verwenden, welche Daten in den Reihen laden werden:

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 

Aber warum es nicht mehr verbessern, wie Sie restlichen Felder müssen nicht es besser ist, nur zu wählen, was Sie brauchen, so:

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