【问题标题】:Ruby on Rails sorting hash of hashes based on value of child hashRuby on Rails 根据子哈希值对哈希进行排序
【发布时间】: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


【解决方案1】:

这里有两个问题:

  1. Enumerable#sort_by 没有就地修改。您需要将返回值重新分配给@payrolls
  2. 您正在构建Hash,而不是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}]]

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

【讨论】:

  • 非常感谢您的回复。可悲的是,我仍然得到相同的输出,输出如下:(id | name | hours | paid)1 |汤姆琼斯 | 10.51 | 105.1 3 |彼得格里芬 | 7.5 | 75.0 2 |约瑟夫·罗杰斯 | 6.2 | 62.0 4 |维乔斯 | 14.0 | 140.0 我需要别的东西,因为它们是浮点值吗?
  • 抱歉格式化。已将此编辑添加到我的原始帖子中
  • 太棒了!我对哈希创建的糟糕方法当然没有帮助。现在唯一的问题是它从低到高而不是从高到低排序,但我应该能够找到那个答案。非常感谢您的帮助!!
  • 是的,最后一点很简单,只是添加了.reverse。再次感谢。
猜你喜欢
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 2012-03-07
  • 2023-04-01
  • 1970-01-01
  • 2011-10-25
相关资源
最近更新 更多