Ich verwende Rails 5 mit Ransack, und ich habe ein Modell mit einer Spalte in meinem Mysql db namens Status. Status ist eine Ganzzahl von 0-5. Ich versuche, eine Standardreihenfolge für diese Spalte zu erstellen, in der es aufsteigend ist, mit Ausnahme von Status, bei denen 0 die letzte ist (1, 2, 3, 4, 5, 0).Rails 5 mit Ransack, benutzerdefinierte Bereich Reihenfolge zum Sortieren
Ich bin in der Lage, die Objekte in aufsteigender Reihenfolge ohne die Objekte zu erhalten, wo Status == 0 mit:
scope :asc_no_approved, lambda { where.not(status: [0]).order('status ASC') }
Und die Objekte, bei denen Status == 0 mit:
scope :approved, lambda { where(status: [0]) }
Gibt es eine Möglichkeit, diesen zweiten Bereich an das Ende des ersten anzuhängen? Ich habe versucht:
scope :asc_approved_last, lambda { where.not(status: [0]).order('status ASC').where(status: [0]) }
Aber das gibt keine Objekte mit der folgenden Mysql:
SELECT `requests`.* FROM `requests` WHERE (`requests`.`status` != 0) AND `requests`.`status` = 0 ORDER BY status ASC LIMIT 10 OFFSET 0
UPDATE:
Da die Kommentare unten etwas verwirrend sind, wenn jemand anderes versucht zu lösen das, das hat bei mir funktioniert. Gemäß der akzeptierte Antwort, dies sind meine Bereiche:
scope :asc_no_approved, lambda { where.not(status: [0]).order('status ASC') }
scope :approved, lambda { where(status: [0]) }
scope :asc_approved_last, lambda { asc_no_approved + approved }
Und hier ist mein Ruf in der Steuerung:
@requests = Kaminari.paginate_array(@q.result.includes(:employee, :user, :title).asc_approved_last).limit(10).page(params[:page])
Das macht Sinn, danke! Da ich sie in Scopes habe, wäre es das Beste, 'approved + asc_no_approved' in einer Methode zu machen? – Chase
Ich bin nicht wirklich der beste Code-Stil, aber ein Bereich ist im Wesentlichen eine Klassenmethode, so dass Sie einen anderen Bereich haben könnten, der die beiden Sammlungen zusammenfügt oder einfach eine Klassenmethode hat, die dasselbe tut. Ich würde wahrscheinlich nur den Spielraum wählen, um die Dinge klarer zu halten? –
Wenn ich sie zusammen wie folgt ketten: 'scope: asc_approved_last, lambda {asc_no_approved.approved}' Ich bekomme den gleichen MySQL-Aufruf, wo es 0 Objekte zurückgibt, und wenn ich versuche, sie so hinzuzufügen: 'scope: asc_approved_last, lambda {asc_no_approved + approved} 'Ich bekomme diesen Fehler mit meiner Seitennummerierung:' undefinierte Methode 'page 'für #'. Ich bin mir nicht sicher, warum ich die Paginierung nicht verwenden darf. Wenn ich nur einen der Bereiche verwende, funktioniert es immer noch. –
Chase