【发布时间】:2013-06-21 10:46:19
【问题描述】:
我查看了许多其他 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 %>
排序目前根本没有任何影响,无论我将它更改为它以相同的顺序输出,我开始认为我错过了哈希的主要(并且可能很明显)部分红宝石。感谢您提出的所有建议。
编辑输出: (身份证、姓名、小时数、收入)
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
【问题讨论】:
-
这是编写代码的一个问题。您初始化
payrolls[p.employee.first_name],然后立即检查它是否为nil。但是在刚刚初始化之后就不能是nil了。所以你的条件的第一个块永远不会被执行。不过,我认为这不是您的主要问题 - 目前还不确定。 -
有趣的一点,谢谢。我认为即使您在下面的答案也没有对其进行排序,我的哈希可能存在更根本的问题而不是排序问题?
-
你是对的(当然),去掉整个条件来检查 nil 行为是一样的!
标签: ruby-on-rails sorting hash