0

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

我一直在阅读 如何计算 Ruby 数组中的重复项

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

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

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

我想要一个函数,它会返回一些指示用户有 2 个徽章“谐振器”。

我试图创建一个类似于 stackoverflow 工作方式的徽章系统。有些徽章可以多次授予,如果是,我想要对徽章进行某种形式的计数。但是我在思考如何做到这一点时遇到了很多麻烦。我想首先我需要计算重复的数量。

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

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

这样它就会显示类似...

徽章:

正义

谐振器 x2

我怎样才能做到这一点?删除重复项是正确的方法吗?帮助将不胜感激。谢谢你!

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

好吧,也许有一种更花哨的 ruby​​ 方法可以做到这一点,但首先你可以这样做:

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​​ 中有一个更好的迭代器来计算。也许那注入或减少。

于 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 回答