ruby-on-rails - 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 中,您可以比较数组。因此,将它们用作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 的解决方案会更简单。
推荐阅读
- functional-testing - 如何在 appbuild 上测试模型级触发器?
- python - 将 Spyder 升级到 4.0.1 时出错:ModuleNotFoundError: No module named 'IPython.core.inputtransformer2'
- android - 如何在 JNI 中编辑 jobjectArray 并将其传递回 Java
- amazon-web-services - 如何使 ip 指向 AWS 上的其他 ip 和端口(来自两个 apache 虚拟主机)
- javascript - 我可以在 JavaScript 中声明变量的地方
- electron - 在 Electron 的“appData”中写入文件。在哪里添加 import { app } from "electron";?
- docusignapi - DocuSign API 方法信封.listStatusChanges 不显示共享给我的用户的信封
- ios - 如何让我的 UIButton 标题有一些填充?
- javascript - 如何将函数作为 React Native 中的属性传递给组件
- excel - 在具有不同名称的工作簿之间复制