如果不是按字母顺序排列逻辑,请按sizename订购商品?

时间:2019-06-26 16:13:57

标签: ruby-on-rails ruby

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

  • Invalid postback or callback argument. Event validation is enabled using in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
  • Variant.create(size_name: "L")
  • Variant.create(size_name: "S")
  • Variant.create(size_name: "XXL")

大小也可以是(30,24,33,31,29)

在我的产品视图中,选择标签按照创建顺序显示。 我想从最小的尺寸到最大的尺寸(S,M,L ...)进行排序。 通过数字尺寸,我可以按最小到最大的顺序订购

如何保证两个大小(数字和字母)可以从最小到最大排序?

2 个答案:

答案 0 :(得分:3)

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

例如,您可以在某处定义例如

SIZE_NAMES = %w[XS S M L XL XXL]

,然后在代码的其他地方,使用类似以下内容的

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

对于更“高级”的解决方案,您可以考虑将每个尺寸定义为自定义对象,而不是常规的String。看看Comparable module<=>(“太空飞船”)运算符。

通过利用此功能,您可能会以例如variants.sort将根据变体的“转换后”大小自动对其进行比较,并按您的期望对其进行排序。

答案 1 :(得分:2)

如果您希望在数据库端进行排序,则有两种选择:

  1. 预定义的排序如下:

    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"
    )
    

    您可能希望将其移至范围,以防万一需要添加另一个size_name,只有一个地方可以更改

  2. 使用active record enums

    enum size_name: { s: 0, l: 1, xl: 2, xxl: 3 }
    

    这样,您仍然可以通过字符串/符号来分配字段,但是基础数据实际上是整数,因此您可以使用order(:size_name, :size)来按size_name和{{1 }}。

    通过这种方式,您可以添加索引以加快订购速度