按布尔值分组但在rails上更改ruby中的键

rap*_*tle 1 ruby arrays ruby-on-rails ruby-on-rails-4

我正在通过一个布尔值的before属性对数组进行排序,这是有效的,但我宁愿不使用true和false作为哈希值,并在true时使用'before',而在when之前使用'after'

a.each { |x| arr << x.answers.group_by(&:before) unless x.answers == nil }
Run Code Online (Sandbox Code Playgroud)

有一个简单的方法吗?

即而不是 true: [], false: [] 我更喜欢拥有before: [], after: []

eng*_*nky 11

肯定是这样的

x.answers.group_by {|e| e.before ? :before : :after}
Run Code Online (Sandbox Code Playgroud)

这将创建一个Hash{before: [],after:[]}

例如.

a = [1,2,3,4,5,6,7]
a.group_by {|n| n.odd? ? :odd : :even} 
#=> {odd: [1, 3, 5, 7], even: [2, 4, 6]}
Run Code Online (Sandbox Code Playgroud)

#group_by处理来自块的返回响应,truefalse成为键,但您可以用您喜欢的任何内容替换响应,而这些将作为键.这意味着您可以获得2次以上的退货,例如

a = [1,2,3,4,5,6,7]
a.group_by {|n| n == 2 ? :two : n == 3 ? :three : n.odd? ? :odd : :even} 
#=> {:odd=>[1, 5, 7], :two=>[2], :three=>[3], :even=>[4, 6]}
Run Code Online (Sandbox Code Playgroud)

我使用三元运算符来节省空间我不建议将它们嵌套这么深,因为它只是一个例子.