2017-07-07 4 views
0

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]) 

Antwort

1

Sie können zusammen Ketten Bereiche wie die Ordnung, könnte man sogar nur tun asc_no_approved.approved aber ich denke, der Grund, warum es keine Objekte zurückkehrt ist, weil Sie für alle Dinge suchen, in dem der Status nicht gleich 0 ist, und dann für die Dinge dieser Sammlung zu fragen, wo der Status 0 ist

WHERE (`requests`.`status` != 0) AND `requests`.`status` = 0 

Wenn Sie die Ergebnisse von approved buchstäblich an asc_no_approved anhängen möchten, dann könnten Sie einfach approved + asc_no_approved

+0

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

+0

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? –

+0

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

Verwandte Themen