【问题标题】:ruby, return count for duplicates红宝石,返回重复计数
【发布时间】:2012-06-08 05:12:14
【问题描述】:

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

我一直在阅读 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

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

【问题讨论】:

    标签: ruby arrays duplicates duplicate-removal badge


    【解决方案1】:

    你可能想做这样的事情:

    控制器:

    @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 %>
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 如果您使用badge 作为密钥,则不需要badges.uniq! => counts.each { |badge, count| ... }
      【解决方案3】:

      由于某种原因,方法 .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 %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-24
        • 2012-05-16
        • 1970-01-01
        • 2012-06-05
        • 2011-08-12
        • 1970-01-01
        • 2017-01-05
        • 2015-08-03
        相关资源
        最近更新 更多