0

誰かが重複の数を返すのを手伝ってくれるかどうか疑問に思っていましたか?

Ruby配列で重複をカウントする方法を読んでい ます

それは私が望むものに非常に近いです。ただし、コードを理解するのは非常に困難です。

たとえば、配列がある場合...

[#<Badge id: 1, name: "justice">, #<Badge id: 9, name: "resonator">, #<Badge id: 9, name: "resonator"> ]

ユーザーがバッジ「レゾネーター」を2つ持っていることを示す関数が必要です。

スタックオーバーフローの仕組みに似たバッジシステムを作成しようとしています。いくつかのバッジは複数回授与できます。ただし、これを行う方法を考えるのに非常に苦労しています。まず、重複の数を数える必要があると思います。

最終的にコードの最後で、バッジの名前を次のようにレンダリングするだけです

<li>
    <%= badge_item.name %>
</li>

次のようなものが表示されるように...

バッジ:

正義

レゾネーター×2

これどうやってするの?重複を削除するのは正しい方法ですか? 助けていただければ幸いです。ありがとう!

4

3 に答える 3

2

あなたはおそらく次のようなことをしたいと思うでしょう:

コントローラ:

@badge_names_with_counts = user.badges.count(group: :name)

意見:

<% @badge_names_with_counts.each do |badge_name_with_count| %>
  <%= badge_name_with_count.name %> x<%= badge_name_with_count.count %>
<% end %>
于 2012-06-08T05:23:04.497 に答える
1

おそらく、もっと派手なルビーの方法がありますが、最初は次のようなことができます。

badges = [#<Badge id: 1, name: "justice">, #<Badge id: 9, name: "resonator">, #<Badge id: 9, name: "resonator"> ]
counts = {}

badges.each do {|badge|
  #depends on you whether you want to count by id or name
  counts[badge.id] ||= 0
  counts[badge.id] += 1
}

そして、安全に配列を一意にして、次のようにカウントを表示できます。

badges.uniq!

badges.each do |badge|
  puts badge.name
  puts counts[badge.id]
end

しかし、カウントを行うためのより良いイテレータがルビーにあると私はかなり確信しています。おそらくそれは注入または削減します。

于 2012-06-08T05:37:04.010 に答える
0

何らかの理由で、メソッド .count が機能していませんでした。多分私はデータベースか何かから引っ張っていませんでしたか?代わりに、コントローラーで行いました..

@badge_names_with_counts = @user.badges.group_by(&:name)

これはハッシュを返し、私はそれをループしました...

<% if @badge_names_with_counts.any? %>
    <ol class='badges'>
    <% @badge_names_with_counts.each do |key, value| %>
        <% if value.count > 1 %>
            <li><%= key %> x <%= value.count %></li><br/>
        <% else %>
            <li><%= key %></li><br/>
        <% end %>
    <% end %>
    </ol>
<% end %>
于 2012-06-09T00:49:13.503 に答える