ruby 可以按字母等级排序吗?[已关闭]

pokxtpni  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(100)

已关闭,此问题需要更focused。它目前不接受回答。
**想改善这个问题吗?**更新问题,使其只关注editing this post的一个问题。

去年就关门了。
Improve this question
我有一张表,我想按字母等级排序。问题是它在用符号排序字母之前先排序字母。例如,它排序:A、A+、A-、B、B+、B-等,但我希望它能对A+、A、A-、B+、B、B-等进行排序。有没有办法设置这样做?

jei2mxaa

jei2mxaa1#

作为想法,你可以检查最后一个字母的等级,并根据其值添加一些数字的等级
您可以向模型添加范围

scope :order_by_grade, -> do
  sql = <<~SQL
    CASE RIGHT(grade, 1)
    WHEN '-' THEN grade || 3
    WHEN '+' THEN grade || 1
    ELSE grade || 2
    END
  SQL

  order(sql)
end

然后应用到您的模型Work.order_by_grade
作为另一个想法,你可以在模型中定义一些常数,所有变量和使用索引
从最差到最好的排序可能是ASC,从最好到最差的排序是DESC,这是你的选择

GRADES = %w[A+ A A- B+ ...]

scope :order_by_grade, -> do
  sql = 'CASE grade '

  GRADES.reverse_each.with_index do |grade, index|
    sql << sanitize_sql_array(['WHEN ? THEN ?', grade, index])
  end

  sql << ' END'

  order(sql)
end

然后应用到您的模型Work.order_by_grade甚至Work.order_by_grade.reverse_order

hgqdbh6s

hgqdbh6s2#

你可以写以下内容。

arr = ["A", "B-", "B+", "A-", "B", "A+"]
order = { '+' => 0, nil => 1, '-' => 2 }
arr.sort_by { |s| [s[0], order[s[1]]] }
  #=> ["A+", "A", "A-", "B+", "B", "B-"]

使用Array#<=>方法比较两个数组的排序。特别是第三段的链接。
假设

s1 = 'A'
s2 = 'A+'

正在被比较。对于s1,我们计算数组

[s[0], order[s[1]]]
  #=> ['A', order[nil]]
  #=> ['A', 1]

对于s2

[s[0], order[s[1]]]
  #=> ['A', order['+']]
  #=> ['A', 0]

作为

['A', 0] <=> ['A', 1]
  #=> -1

'A+''A'之前排序。

相关问题