2 Stimmen

Sort Array in Controller Sortiere Array im Controller

Hallo, ich möchte ein Array in einem Rails-Controller sortieren. Ich möchte das Array sortieren, bevor ich es in der Ansicht durchlaufe

@projects = Project.all.sort # wirft einen Fehler
#und
@projects = Project.all
@projects.sort               # wirft einen Fehler

wirft diesen Fehler: undefined method <=> for # aber wenn ich abfrage:

@projects.respond_to?('sort')

bekomme ich true

Wie kann ich das Array sortieren? Sollte es in der Ansicht oder im Controller gemacht werden? Jede Hilfe wird sehr geschätzt!

15voto

True Soft Punkte 8496

Ruby weiß nicht, wie man Ihr Projekt sortieren soll. Sie müssen das Feld angeben, das für die Sortierung verwendet werden soll. Beispiel für created_at:

@projects = Project.all.sort { |p1, p2| p1.created_at <=> p2.created_at }

oder

@projects = Project.all.sort_by &:created_at

Alternativ können Sie sie auf Datenbankebene sortieren:

@projects = Project.find(:all, :order => 'created_at')

4voto

Gareth Punkte 123487

Wenn Sie versuchen, ein Array von Objekten zu sortieren, muss Ruby wissen, wie entschieden werden soll, welche Objekte zuerst kommen.

Wenn Ihre Objekte eine inhärente Reihenfolge haben, z.B. Sie haben eine "Nummer", nach der sortiert werden soll, implementieren Sie eine Methode in Ihrem Projekt wie folgt:

def <=> other
  number <=> other.number
end

Die <=> Methode wird von Ruby verwendet, um zwei Objekte zu vergleichen und festzustellen, welches zuerst erscheint. In diesem Beispiel delegieren wir das Sortieren einfach an das Nummernattribut (Strings und Zahlen haben bereits eine eingebaute Reihenfolge)

Die Alternative, wenn es viele Möglichkeiten gibt, Ihre Objekte zu sortieren, besteht darin, zur Sortierzeit anzugeben, wie sortiert werden soll. Wie True Soft erklärt hat, gibt es einige Möglichkeiten, dies zu tun, meine bevorzugte Methode ist

 @projects = Project.all.sort_by &:created_at

..um nach dem Feld created_at zu sortieren

0voto

Dave Sims Punkte 4979

Der einfachste Weg ist es, <=> in einem Projekt zu überschreiben:

def <=>(other_project)
  self.some_comparable_field <=> other_project.some_comparable_field
  # oder anderweitig 1, 0 oder -1 basierend auf einer benutzerdefinierten Vergleichsregel zurückgeben
end

Dann wird Ihr Originalcode funktionieren.

Siehe: http://ruby-doc.org/core/classes/Comparable.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X