我想知道是否有人可以帮我回复重复计数?
我一直在读 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
我该怎么做?正在删除重复的正确方法?帮助将不胜感激。谢谢!
答案 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 %>