我有一張桌子vehicles。has_one vehicle_size該VehicleSize模型在表中有一個列,即size一個字串。以下是size值的示例:12ft, 19ft, EV. vehicles目標是根據vehicle_sizes表格的大小進行排序。
這是我目前的解決方案:
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
上面的解決方案執行排序。但是,首先,我需要將所有zero值推到末尾,無論順序是desc或asc(* 零表示EV或任何其他沒有數字的字串)。
我嘗試使用 對記錄進行排序.sort { ... },但它回傳一個array而不是active relation, 對我來說是必需的。
我得到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
如何修改我的第一個或第二個解決方案以回傳一個無論排序如何都將active relation全部String(零)推到末尾的位置?我在這里錯過了什么嗎?
非常感謝您考慮我的要求。
uj5u.com熱心網友回復:
VehicleSize.order(Arel.sql("size = 'EV', size"))
或者
VehicleSize.order(Arel.sql("size = 'EV', size desc"))
這樣,大小 = EV 的記錄將排在最后,但其他記錄將根據您的需要進行排序
結果將是關系
如果需要指定表名,可以使用vehicle_sizes.size代替size
如果你有幾個沒有數字的值(這里是 EV 和 ED),你可以做這樣的事情來避免硬編碼
zero_array = %w[EV ED]
VehicleSize.order(
VehicleSize.sanitize_sql_for_order([Arel.sql("size IN (?), size DESC"), zero_array])
)
uj5u.com熱心網友回復:
您可以在訂單中添加新欄位
vehicle_sizes.size = 0, vehicle_sizes.size DESC
或者
vehicle_sizes.size <> 0, vehicle_sizes.size DESC
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/460568.html
上一篇:如何使用水豚驗證表是否為空?
