Ruby on rails 按sizename排序而不是按字母顺序排序?

Ruby on rails 按sizename排序而不是按字母顺序排序?,ruby-on-rails,ruby,Ruby On Rails,Ruby,在我的应用程序中,管理员可以按此顺序为其产品添加尺寸 Variant.createsize_名称:L Variant.createsize_名称:S Variant.createsize_名称:XXL Variant.createsize_名称:XL 尺寸也可以是30,24,33,31,29 在“我的产品”视图中,“选择”标记按创建顺序显示。 我想从最小的尺寸到最大的S,M,L。。。。 有了数字尺寸,我可以从最小到最大订购,没问题 我是如何确保数字和字母大小可以从最小到最大排序的?有很多方法可以

在我的应用程序中,管理员可以按此顺序为其产品添加尺寸

Variant.createsize_名称:L Variant.createsize_名称:S Variant.createsize_名称:XXL Variant.createsize_名称:XL 尺寸也可以是30,24,33,31,29

在“我的产品”视图中,“选择”标记按创建顺序显示。 我想从最小的尺寸到最大的S,M,L。。。。 有了数字尺寸,我可以从最小到最大订购,没问题


我是如何确保数字和字母大小可以从最小到最大排序的?

有很多方法可以解决这个问题,但在任何解决方案的核心,您都需要手动定义顺序或使用已经为您编写了此手动排序的第三方库

例如,您可以在某处定义

SIZE_NAMES = %w[XS S M L XL XXL]
然后在代码中的其他地方,使用如下内容:

variants.sort_by { |variant| SIZE_NAMES.index(variant.size) }

对于更高级的解决方案,您可以考虑将每个大小定义为自定义对象,而不是常规字符串。看一看这个,还有飞船操作员


通过利用此功能,您可以以这样一种方式实施此功能,例如variants.sort将自动按转换后的大小比较变体,并按您的预期对其进行排序。

解决此问题的方法有很多,但是,在任何解决方案的核心,您都需要手动定义订单,或者使用已经为您编写了此手动订单的第三方库

例如,您可以在某处定义

SIZE_NAMES = %w[XS S M L XL XXL]
然后在代码中的其他地方,使用如下内容:

variants.sort_by { |variant| SIZE_NAMES.index(variant.size) }

对于更高级的解决方案,您可以考虑将每个大小定义为自定义对象,而不是常规字符串。看一看这个,还有飞船操作员


利用这一点,您可以以这样一种方式实现它,例如variants.sort将自动按转换后的大小比较变体,并按照您的预期对其排序。

如果您希望在db端进行排序,则您有两个选项:

预定义的排序如下:

Variant.order(
 "CASE size_name
    WHEN 'S' THEN 1
    WHEN 'L' THEN 2
    WHEN 'XL' THEN 3
    WHEN 'XXL' THEN 4
    ELSE 10
  END, size, id"
)
您可能希望将其移动到范围,以便在需要添加另一个尺寸名称的情况下,只需更改一个位置

与:

这样,您仍然可以通过字符串/符号分配字段,但基础数据实际上是一个整数,因此您可以使用order:size\u name、:size按size\u name和size排序

也可以通过这种方式添加索引以加快排序


如果您希望在db端进行排序,则有两个选项:

预定义的排序如下:

Variant.order(
 "CASE size_name
    WHEN 'S' THEN 1
    WHEN 'L' THEN 2
    WHEN 'XL' THEN 3
    WHEN 'XXL' THEN 4
    ELSE 10
  END, size, id"
)
您可能希望将其移动到范围,以便在需要添加另一个尺寸名称的情况下,只需更改一个位置

与:

这样,您仍然可以通过字符串/符号分配字段,但基础数据实际上是一个整数,因此您可以使用order:size\u name、:size按size\u name和size排序

也可以通过这种方式添加索引以加快排序


您还可以创建一个散列,将每个大小映射到一个整数,例如大小顺序=大小名称。每个具有索引的大小依次为“to”和“variants”。按大小顺序排序。您还可以创建一个散列,将每个大小映射到一个整数,例如大小顺序=大小名称。每个具有索引的大小依次为“to”和“variants”。按大小顺序排序。