You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:45:09