首页 > 解决方案 > Rails 通过查找值在 sort_ 中应用条件

问题描述

我正在按照以下标题对员工列表进行排序:

TAGS = {
'Region Manager' => 1,
'Region Sales Manager' => 2,
'General Manager' => 3,
'Residential Sales Manager' => 4,
'Commercial Sales Manager' => 5,
'Other' => 6
}.freeze

def sorting_by_title(employees)
 employees.sort_by do |x|
   TAGS[x[:title]]
 end
end

工作正常,但是......如果员工姓氏是史密斯并且需要在其他人之前进行,我还需要进行额外的排序。

所以我尝试做类似的事情:

return TAGS[x[:title]] unless x.last_name == "Smith"

不工作。它在显示页面上使用未定义的方法“每个”为 2:Integer 出错。

所以我的想法是我会建立另一种方法来查找姓氏。

def nepotism(employees)
 employees.group_by do |emp|
   case emp.last_name
   when /Smith/ then :moocher
   end
 end
end

所以我试着像这样引用它:

return TAGS[x[:title]] unless x.nepotism
return TAGS[x[:title]] unless x.moocher

这些都不起作用。裙带关系以未定义的方法 `nepotism' 结束 # 而 Moocher 以相同的方式结束。然后我意识到一个简单的查询会更好一些:

def nepotism
 @nepotism = Employee.where(last_name: "Smith")
end

如果通过标签匹配 Smith 和 THEN,是否有更好的方法来 sort_by a last_name?

标签: ruby-on-rails

解决方案


这是一个不错的技巧:在 ruby​​ 中,您可以比较数组。因此,将它们用作sort_by. 它们逐个元素进行比较。如果ary1[0] < ary2[0],则 ary1 将小于 ary2,无论其余元素如何。

 employees.sort_by do |x|
   [
     x.last_name == "Smith" ? 0 : 1, # all zeroes come before all ones
     TAGS[x[:title]] # your main ordering parameter
   ]
 end

如果有很多 Smiths 并且您需要按它们之间的头衔对它们进行排序,这将非常有效。如果只有一个 Smith,那么 @Björn 的解决方案会更简单。


推荐阅读