Ich habe eine Tabelle vehicles
, die has_one
vehicle_size
. Das VehicleSize
Modell hat eine Spalte in der Tabelle size
, einen String. Hier sind Beispiele für einen size
Wert: 12ft, 19ft, EV
. Das Ziel ist es, vehicles
basierend auf der Größe aus der vehicle_sizes
Tabelle zu sortieren.
Hier meine aktuelle Lösung:
def order_by_size(resources)
return resources unless context.params[:by_size] == 'asc' || context.params[:by_size] == 'desc'
if context.params[:by_size] == 'desc'
resources.joins(:vehicle_size).group('vehicle_sizes.size').order('vehicle_sizes.size DESC')
else
resources.joins(:vehicle_size).group('vehicle_sizes.size').order('vehicle_sizes.size ASC')
end
end
Die obige Lösung führt eine Sortierung durch. Zuerst muss ich jedoch alle zero
Werte an das Ende schieben, unabhängig davon, ob die Reihenfolge desc
oder ist asc
(* Null bedeutet EV
oder eine andere Zeichenfolge ohne Zahlen).
Ich habe versucht, Datensätze mit zu sortieren .sort {... }
, aber es gibt ein array
anstelle von zurück active relation
, wobei für mich notwendig ist.
Lösung wo bekomme ich ein array
with sort
:
def order_by_size(resources)
return resources unless context.params[:by_size] == 'asc' || context.params[:by_size] == 'desc'
if context.params[:by_size] == 'desc'
resources.joins(:vehicle_size).group('vehicle_sizes.size').sort do |x, y|
if x.vehicle_size.size.to_i.zero?
1
elsif y.vehicle_size.size.to_i.zero?
-1
else
y.vehicle_size.size.to_i <=> x.vehicle_size.size.to_i
end
end
else
resources.joins(:vehicle_size).group('vehicle_sizes.size').sort do |x, y|
if x.vehicle_size.size.to_i.zero?
1
elsif y.vehicle_size.size.to_i.zero?
-1
else
x.vehicle_size.size.to_i <=> y.vehicle_size.size.to_i
end
end
end
end
Wie kann ich meine erste oder zweite Lösung ändern, um eine zurückzugeben, active relation
bei der alle String
(Nullen) unabhängig von der Sortierung an das Ende geschoben werden? Übersehe ich hier etwas?
Vielen Dank für die Berücksichtigung meiner Anfrage.
Lösung des Problems
VehicleSize.order(Arel.sql("size = 'EV', size"))
oder
VehicleSize.order(Arel.sql("size = 'EV', size desc"))
Auf diese Weise werden Datensätze mit der Größe = EV zuletzt angezeigt, andere werden jedoch nach Bedarf sortiert
Das Ergebnis wird eine Beziehung sein
Wenn Sie den Tabellennamen angeben müssen, können Sie vehicle_sizes.size
stattdessen verwendensize
Keine Kommentare:
Kommentar veröffentlichen