Ruby on Rails根据子哈希值对哈希值进行排序

时间:2013-06-21 10:46:20

标签: ruby-on-rails sorting hash

我已经查看了许多其他ruby哈希/排序帖子,但似乎无法让这个下来。我有一个'payrolls'哈希,通过在给定日期期间循环遍历ActiveRecord完成的工作集来构建。有日期选择器可以选择往返日期,我想订阅大部分工作时间的用户输出。

schedules = Schedule.where(:employer => employer_id).includes(:employee).order('date ASC')
@payrolls = Hash.new()

schedules.each do |p|   
    payrolls[p.employee.first_name] ||= {}
    payrolls[p.employee.first_name]['money_earned'] = payrolls[p.employee.first_name]['money_earned'].to_f + p.money_earned.to_f
    payrolls[p.employee.first_name]['hours_worked'] = payrolls[p.employee.first_name]['hours_worked'].to_f + p.hours_worked.to_f
end

@payrolls.sort_by { |k, v| v[:money_earned] }

我知道这可能有点像构建哈希的PHP,但这是我在PHP开发5年后的第一个主要的rails项目。只要它工作正常,但我不会拒绝更好的选择!

我认为,纯粹是为了测试这一刻:

<%  @payrolls.each do |key, value| %>
    <div class="payroll_employee">
        <%= key %> <%= value['money_earned'] %> <%= value['hours_worked'] %>
    </div>
<% end %>

排序目前根本没有任何影响,无论我改变它以相同的顺序输出它我开始认为我错过了哈希的一个主要(可能是显而易见的)部分红宝石。感谢您提出的所有建议。

编辑输出:     (id,name,hours,earn)

1 | Tom Jones | 10.51 | 105.1
3 | Peter Griffen | 7.5 | 75.0
2 | Joseph Rogers | 6.2 | 62.0
4 | Weee Joss | 14.0 | 140.0

1 个答案:

答案 0 :(得分:0)

这里有两个问题:

  1. Enumerable#sort_by未进行适当修改。您需要将返回值重新分配给@payrolls
  2. 您正在构建Hash,而不是HashWithIndifferentAccess。由于您使用的是字符串键,因此需要保持一致。您的#sort_by按符号键排序。
  3. 试试这个:

    @payrolls = @payrolls.sort_by { |_, v| v['money_earned'] }

    只是添加更多信息:

    此表达式的返回值实际上甚至不是Hash。这是一个例子:

    1.9.3p392 :012 > { a: { q: 1 }, c: { q: 3 }, b: { q: 2 } }.sort_by { |_, v| v[:q] }
     => [[:a, {:q=>1}], [:b, {:q=>2}], [:c, {:q=>3}]]
    

    很酷的部分是你的视图代码无论如何都可以正常工作,即使它获得了一个数组数组!