按方法对Rails模型属性进行排序

时间:2018-12-12 20:56:28

标签: ruby sorting ruby-on-rails-5

我有一个模型,该模型使用一种方法在视图上显示属性。我设法对它们进行了排序,但是它们没有按照我需要对其进行排序的方式进行排序。

enter image description here

我想在顶部显示红色数量,但是我需要将绿色和黄色数量反转。顺序应该是红色,黄色然后是绿色。

以下是为列添加颜色的方法:

def get_quantity_text_class
  case
  when quantity_on_hand > reorder_quantity then 'text-success'
  when quantity_on_hand > p_level then 'text-warning'
  else 'text-danger'
  end
end

这是创建列的方法:

def quantity_on_hand
  ppkb.sum(:quantity)
end

这是我正在使用的排序算法:

sort_by{ |item| item.get_quantity_text_class }

我觉得我已经很近了,但我只是想不出如何反转绿色和黄色数字。

2 个答案:

答案 0 :(得分:2)

当前基于字符串值text-dangertext-successtext-warning进行排序。要按所需方式对其进行排序,请尝试根据数值对其进行排序:

sort_by do |item| 
  case item.get_quantity_text_class
     when 'text-danger'
       0
     when 'text-warning'
       1
     else
       2
  end
end

答案 1 :(得分:0)

您可以在Item中定义比较器

class Item
  def <=>(another_item)
    txt_class   = self.get_quantity_text_class
    o_txt_class = another_item.get_quantity_text_class 

    if txt_class == o_txt_class
      # put your logic here for items with identical classes.
      # for example: 
      self.quantity_on_hand <=> another_item.quantity_on_hand
    end

    text_classes = ['text-danger', 'text-warning', 'text-success']

    txt_class_idx   = text_classes.find_index { |e| e == txt_class }
    o_txt_class_idx = text_classes.find_index { |e| e == o_txt_class }

    txt_class_idx <=> o_txt_class_idx
  end
end

然后致电items.sort