Rails中对Stripe API返回的价格哈希数组按nickname降序排序的方法
Rails 中 Stripe 价格列表按 S/M/L 自定义顺序排序方案
问题根因
你之前使用的默认sort_by排序是按字符串Unicode编码排序,英文字母序下 L < M < S,和你需要的 S→M→L 顺序不匹配;如果加负号、reverse后仍不生效,大概率是你取值的键不正确,Stripe 返回的Stripe::Price实例对象的属性优先用方法调用,而非符号/字符串哈希键取值。
实现步骤
1. 定义自定义排序权重映射
在控制器或对应的 Helper 中定义固定的尺码优先级,后续新增尺码也可以直接在这个映射里补充:
# 可根据业务需求扩展其他尺码,比如 XS、XL 等 SIZE_PRIORITY = { 'S' => 1, 'M' => 2, 'L' => 3 }.freeze
2. 对价格列表做自定义排序
取值时优先用对象属性调用,如果确认是纯哈希再用哈希键取值:
# 针对 Stripe 返回的 Stripe::Price 实例对象 @sorted_prices = @compositionsProduct.sort_by do |price| # 未知尺码默认排到最后,避免 nil 导致排序报错 SIZE_PRIORITY.fetch(price.nickname, 99) end # 如果确认拿到的是纯哈希,且键是符号类型,使用下面的写法 # @sorted_prices = @compositionsProduct.sort_by { |hash| SIZE_PRIORITY.fetch(hash[:nickname], 99) }
3. 视图层遍历渲染
在 ERB 模板中遍历排序后的列表,生成对应跳转链接即可:
<% @sorted_prices.each do |price| %> <%= link_to price.nickname, price_path(price.id), class: "size-link" %> <% end %>
简易适配方案(仅固定S/M/L三个尺码时可用)
如果你的业务场景只有S、M、L三个固定尺码,也可以直接对默认字母序的结果做反转,无需自定义权重:
# 先确认 hash[:nickname]/hash.nickname 能正确拿到值,再用 reverse 反转顺序 @sorted_prices = @compositionsProduct.sort_by { |item| item.nickname }.reverse
内容的提问来源于stack exchange,提问作者JoCoz
相关产品推荐
相关产品推荐

