рубин, возвращает количество дубликатов

мне было интересно, может ли кто-нибудь помочь мне вернуть количество дубликатов?

Я читал Как подсчитать дубликаты в массивах Ruby

и это очень близко к тому, что я хочу. однако код довольно сложен для понимания.

например, если бы у меня был массив...

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

Я бы хотел, чтобы функция возвращала некоторое указание на то, что у пользователя есть 2 значка «резонатор».

Я пытаюсь создать систему значков, аналогичную тому, как работает stackoverflow. некоторые значки могут быть присуждены несколько раз, и если это так, я хочу, чтобы на значках была какая-то форма подсчета. однако у меня было много проблем, думая, как это сделать. Я думаю, сначала мне нужно подсчитать количество дубликатов.

в конце концов, в конце моего кода я просто отображаю имя значка так

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

чтобы он показывал что-то вроде...

значки:

справедливость

резонатор x2

Как я могу это сделать? удаление дубликатов правильный путь? помощь будет оценена. Спасибо!


person Sasha    schedule 08.06.2012    source источник


Ответы (3)


Вы, вероятно, хотите сделать что-то вроде этого:

Контроллер:

@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 %>
person Chris Mohr    schedule 08.06.2012

Ну, возможно, есть более причудливый рубиновый способ сделать это, но для начала вы можете сделать что-то вроде:

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 ​​есть лучший итератор для подсчета. Возможно что залить или уменьшить.

person Renra    schedule 08.06.2012
comment
Если вы используете badge в качестве ключа, вам не нужно badges.uniq! => counts.each { |badge, count| ... } - person Victor Moroz; 08.06.2012

по какой-то причине метод .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 %>
person Sasha    schedule 09.06.2012