Ich habe eine Sammlung von Post-Objekten und möchte sie basierend auf diesen Bedingungen sortieren können:
Einige Beiträge haben Daten (Nachrichten und Ereignisse), andere haben explizite Positionen (Labs und Portfolio).
Ich möchte %code% aufrufen können, also habe ich %code% außer Kraft gesetzt, aber ich suche nach dem effektivsten Weg, nach diesen Bedingungen zu sortieren. Unten ist eine Pseudo-Methode:
%Vor%Es sieht so aus, als müsste ich eigentlich zwei getrennte Zeiten sortieren, anstatt alles in diese eine Methode zu stopfen. So etwas wie %code% , dann %code% . Was ist der rubinste Weg, dies zu tun?
Sie sollten immer nach den gleichen Kriterien sortieren, um eine sinnvolle Reihenfolge zu gewährleisten. Wenn man zwei %code% Daten vergleicht, ist es in Ordnung, dass %code% die Reihenfolge beurteilt, aber wenn man ein %code% Datum mit einem festgelegten Datum vergleicht, muss man unabhängig von der Position entscheiden, welche zuerst geht durch Zuordnen von %code% zu einem Tagesweg in der Vergangenheit).
Andernfalls stellen Sie sich Folgendes vor:
%Vor%Nach Ihren ursprünglichen Kriterien hätten Sie: a & lt; b & lt; c & lt; ein. Also, welche ist die kleinste?
Sie möchten die Sortierung auch sofort durchführen. Verwenden Sie für Ihre %code% Implementierung %code% :
%Vor%Wenn Sie Ihre Vergleichskriterien nur einmal verwenden oder wenn dieses Kriterium nicht universell ist und Sie daher %code% nicht definieren möchten, können Sie %code% mit einem Block verwenden:
%Vor%Besser noch, es gibt %code% und %code% , die Sie verwenden können, um ein Array zu erstellen, um zu vergleichen, in welcher Priorität:
%Vor%Neben der kürzeren Verwendung hat %code% den Vorteil, dass Sie nur ein gut geordnetes Kriterium erhalten können.
Anmerkungen:
Alternativ können Sie die Sortierung auf einen Schlag in einem Array durchführen. Der einzige Fall, bei dem eines der Attribute null ist, kann trotzdem gehandhabt werden, wenn Sie den Datensatz kennen, indem Sie den entsprechenden Nullschutz auswählen . Es ist auch nicht aus Ihrem Pseudo-Code klar, wenn die Vergleiche von Datum und Position in einer Prioritätsreihenfolge oder der einen oder der anderen aufgelistet sind (d.h. das Verwendungsdatum, wenn es für beide andere Verwendungspositionen existiert). Die erste Lösung geht von Verwendung, Kategorie, gefolgt von Datum, gefolgt von Position
aus %Vor%Sekunde setzt voraus, dass es sich um ein Datum oder eine Position handelt
%Vor%Ich habe eine Sammlung von Post-Objekten und möchte sie basierend auf diesen Bedingungen sortieren können:
Einige Beiträge haben Daten (Nachrichten und Ereignisse), andere haben explizite Positionen (Labs und Portfolio).
Ich möchte posts.sort!
aufrufen können, also habe ich <=>
außer Kraft gesetzt, aber ich suche nach dem effektivsten Weg, nach diesen Bedingungen zu sortieren. Unten ist eine Pseudo-Methode:
Es sieht so aus, als müsste ich eigentlich zwei getrennte Zeiten sortieren, anstatt alles in diese eine Methode zu stopfen. So etwas wie sort_by_category
, dann sort!
. Was ist der rubinste Weg, dies zu tun?
Sie sollten immer nach den gleichen Kriterien sortieren, um eine sinnvolle Reihenfolge zu gewährleisten. Wenn man zwei nil
Daten vergleicht, ist es in Ordnung, dass position
die Reihenfolge beurteilt, aber wenn man ein nil
Datum mit einem festgelegten Datum vergleicht, muss man unabhängig von der Position entscheiden, welche zuerst geht durch Zuordnen von nil
zu einem Tagesweg in der Vergangenheit).
Andernfalls stellen Sie sich Folgendes vor:
%Vor%Nach Ihren ursprünglichen Kriterien hätten Sie: a & lt; b & lt; c & lt; ein. Also, welche ist die kleinste?
Sie möchten die Sortierung auch sofort durchführen. Verwenden Sie für Ihre <=>
Implementierung #nonzero?
:
Wenn Sie Ihre Vergleichskriterien nur einmal verwenden oder wenn dieses Kriterium nicht universell ist und Sie daher <=>
nicht definieren möchten, können Sie sort
mit einem Block verwenden:
Besser noch, es gibt sort_by
und sort_by!
, die Sie verwenden können, um ein Array zu erstellen, um zu vergleichen, in welcher Priorität:
Neben der kürzeren Verwendung hat sort_by
den Vorteil, dass Sie nur ein gut geordnetes Kriterium erhalten können.
Anmerkungen:
sort_by!
wurde in Ruby 1.9.2 eingeführt. Sie können require 'backports/1.9.2/array/sort_by'
mit älteren Rubies verwenden. Post
keine Unterklasse von ActiveRecord::Base
ist (in diesem Fall sollte die Sortierung vom db-Server ausgeführt werden). Alternativ können Sie die Sortierung auf einen Schlag in einem Array durchführen. Der einzige Fall, bei dem eines der Attribute null ist, kann trotzdem gehandhabt werden, wenn Sie den Datensatz kennen, indem Sie den entsprechenden Nullschutz auswählen . Es ist auch nicht aus Ihrem Pseudo-Code klar, wenn die Vergleiche von Datum und Position in einer Prioritätsreihenfolge oder der einen oder der anderen aufgelistet sind (d.h. das Verwendungsdatum, wenn es für beide andere Verwendungspositionen existiert). Die erste Lösung geht von Verwendung, Kategorie, gefolgt von Datum, gefolgt von Position
aus %Vor%Sekunde setzt voraus, dass es sich um ein Datum oder eine Position handelt
%Vor%Tags und Links ruby sorting operators comparison-operators spacecraft-operator