Ich möchte eine Galerie von products
anzeigen, wo ich Produkte, die sowohl zum Verkauf als auch zum Verkauf stehen, enthalten. Nur ich möchte, dass die products
, die zum Verkauf stehen, am Anfang der Liste erscheinen und die Objekte, die nicht zum Verkauf stehen, erscheinen am Ende der Liste.Ist es möglich, eine Liste von Objekten abhängig von der Antwort des einzelnen Objekts auf eine Methode zu sortieren?
Eine einfache Möglichkeit für mich, dies zu tun ist zwei Listen zu machen, sie dann zusammenführen (eine Liste der on_sale Objekte und eine Liste der nicht on_sale Objekte?):
available_products = []
sold_products = []
@products.each do |product|
if product.on_sale?
available_products << product
else
sold_products << product
end
end
. . . Aber, um die Struktur meiner bestehenden App zu tun, würde dies eine übermäßige Menge an Refactoring aufgrund einer Kuriosität in meinem Code erfordern (ich verliere meine Seitennummerierung, und ich würde lieber nicht umgestalten). Es wäre einfacher, wenn es eine Möglichkeit gäbe, die existierende Liste von Objekten nach der product
Methode zu sortieren, die einen booleschen Wert zurückgibt.
Ist es möglich, eine vorhandene Liste eleganter zu durchlaufen und sie nach diesem wahren oder falschen Wert in Rails zu sortieren? Ich frage nur, weil es so viel ist, dass ich mich nicht bewusst bin, versteckt in diesem Rahmen/Sprache (Ruby) und ich würde gerne wissen, ob sie vor mir gearbeitet haben.
Sieht gut getan werden! Aber ich habe Probleme mit meinem spezifischen Code, vielleicht kannst du mir dabei helfen. Wenn ich den Einzeiler verwende, bekomme ich den folgenden Fehler "Vergleich von FalseClass mit true failed", und wenn ich den ersten Code verwende, den du erwähnt hast, bekomme ich einen Vergleich von [MyModule] :: Product mit [MyModule] :: Product failed '. Nicht sicher, warum das scheitern würde. – Ecnalyr
Einige Anmerkungen: 1) Man sollte immer 'sort_by' verwenden, wenn möglich (deklarativer, prägnanter, effizienter). Es ist möglich, es in allen oben gezeigten Snippets zu verwenden. 2) Es mag mir besser sein, auf die nicht-destruktive 'Enumerable # sort_by' zu verlinken, in-place-Updates sollten nach Möglichkeit vermieden werden. 3) '@ product.sort_by (&: on_sale?)'. – tokland
Sieht aus wie '<=>' funktioniert nicht richtig für Booleans (in Ruby-1.9.3-P327). Schauen Sie es jetzt ... Ja, http://grosser.it/2010/07/30/ruby-true-false-comparison-with/ bestätigt es für eine frühere Version – AlexChaffee