在使用group_by的查询中使用Rails 4中的三元语句

时间:2015-03-22 17:31:44

标签: ruby-on-rails ruby

我遇到了一些有趣的事情,我认为这与操作员优先级有关,但不确定我是否只是留下了一些东西。我想在我的.group_by排序中对Rails中的数据库查询使用三元语句。所以我有这样的东西有效:

@tools = Tool.all.group_by {|tool| tool.name}
#=> @tools {'anvil' => [<#tool....

返回哈希工具对象,分组为名称相同的键。然后提出将它们按字母组排序,名字的第一个字母将是所需的输出,所以:

@tools = Tool.all.group_by {|tool| tool.name.downcase[0] }
#=> @tools {'a' => [<#tool.....

太棒了,现在我有一个按名字第一个字母分组的工具哈希值。但是,如果一个名字以其他一些东西开头呢?不是问题,它只是拉出第一个字符并将其用于组,因此工具名称以&#34; 1&#34;开头。进入哈希成员,其键是&#34; 1&#34;。对于不是字母的非数字字符也是如此。

这里有一个问题:我可以使用条件语句选择将我的所有字母名称排序成字母组,但将其他所有内容放入一个组中,其中包含一些键,如#34;#&#34 ;。但我不能用三元声明来做这件事:

@tools = Tool.all.group_by {|tool| if ('a'..'z').include? tool.name.downcase[0] then tool.name.downcase[0] else '#' end }

效果很好!我将所有非字母名称分类到散列的@tools['#']部分。

但这不起作用:

@tools = Tool.all.group_by {|tool| ('a'..'z').include tool.name.downcase[0] ? tool.name.downcase[0] : '#' }

它返回仅包含两个成员的哈希:@tools[true]@tools[false]。我可以理解为什么,作为一个三元运算符返回真或假,但它不应该像if-then-else语句一样?它必须是group_by跳枪的东西?

有没有办法调整group_by语句的语法,使三元运算符像我想要的那样工作?我已经尝试在parens()中附上两个return语句,但这似乎没有用。我在parens中尝试了整个三元语句,希望在返回group_by函数之前评估整个事情......任何想法?

1 个答案:

答案 0 :(得分:1)

这是由ruby解析为

 ('a'..'z').include?(tool.name.downcase[0] ? tool.name.downcase[0] : tool.name = '#')

('a'..'z').include?(tool.name.downcase[0])相同,假设没有名称为空?它等同于您之前的版本

('a'..'z').include?(tool.name.downcase[0]) ? tool.name.downcase[0] : tool.name = '#'

顺便说一句,实际上用tool.name='#'更改名称对我来说听起来真是个坏主意。这可能没关系,但以后可能会轻易咬你。