0

私は他の多くのルビーハッシュ/ソートの投稿を見てきましたが、これを下げることができないようです. 特定の期間に完了した作業の 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 のようなものかもしれませんが、5 年間の PHP 開発の後の最初の主要な Rails プロジェクトです。それが機能する限りは問題ありませんが、より良い代替手段にノーとは言いません!

そして、純粋にその瞬間をテストするための私の見解:

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

現在、並べ替えはまったく効果がありません。何を変更しても同じ順序で出力され、Ruby のハッシュの主要な (そしておそらく明らかな) 部分が欠けていると思い始めています。あらゆる提案に感謝します。

出力用に編集: (id、名前、時間、獲得)

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

ここには 2 つの問題があります。

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

クールな部分は、たとえ配列の配列を取得したとしても、あなたのビューコードは修正なしで動作するということです!

于 2013-06-21T11:23:20.367 に答える