ruby,返回重复计数

时间:2012-06-08 05:12:15

标签: ruby arrays duplicates duplicate-removal badge

我想知道是否有人可以帮我回复重复计数?

我一直在读  How to count duplicates in Ruby Arrays

这与我想要的非常接近。但是代码很难理解。

例如,如果我有一个数组...

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

我想要一个能够返回一些指示用户有2个徽章“谐振器”的功能。

我试图创建一个类似于stackoverflow工作方式的徽章系统。一些徽章可以多次颁发,如果是,我希望对徽章进行某种形式的计数。但是我一直在考虑如何做到这一点。我想首先我需要计算重复数量。

最终在我的代码结束时,我只是像这样呈现徽章名称

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

这样它就会显示出......

徽章:

正义

谐振器x2

我该怎么做?正在删除重复的正确方法?帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分: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 %>

答案 1 :(得分: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

但是我很确定在ruby中有一个更好的迭代器来计算。也许是注入或减少。

答案 2 :(得分: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 %>