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