0

我查看了许多其他 ruby​​ 哈希/排序帖子,但似乎无法理解这一点。我有一个“工资单”哈希,它是通过在给定日期期间循环通过一组已完成工作的 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 %>

排序目前根本没有任何影响,无论我将其更改为以相同的顺序输出,我开始认为我错过了 Ruby 中哈希的一个主要(并且可能是显而易见的)部分。感谢您的任何建议。

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

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
4

1 回答 1

0

这里有两个问题:

  1. Enumerable#sort_by没有就地修改。您需要将返回值重新分配给@payrolls.
  2. 您正在构建 a Hash,而不是 a HashWithIndifferentAccess。由于您使用的是字符串键,因此您需要对此保持一致。您#sort_by按符号键排序。

试试这个:

@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}]]

很酷的部分是您的视图代码无需修改即可正常工作,即使它得到一个数组数组!

于 2013-06-21T11:23:20.367 回答