GOOGLE ADS

Freitag, 29. April 2022

Alle Nullwerte ans Ende schieben - Ruby on Rails (Postgresql)

Ich habe eine Tabelle vehicles, die has_one vehicle_size. Das VehicleSizeModell hat eine Spalte in der Tabelle size, einen String. Hier sind Beispiele für einen sizeWert: 12ft, 19ft, EV. Das Ziel ist es, vehiclesbasierend auf der Größe aus der vehicle_sizesTabelle 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 zeroWerte an das Ende schieben, unabhängig davon, ob die Reihenfolge descoder ist asc(* Null bedeutet EVoder eine andere Zeichenfolge ohne Zahlen).

Ich habe versucht, Datensätze mit zu sortieren .sort {... }, aber es gibt ein arrayanstelle von zurück active relation, wobei für mich notwendig ist.

Lösung wo bekomme ich ein arraywith 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 relationbei 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.sizestattdessen verwendensize

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...