Контроллер:

@user_location = Country.joins(:user).order(:name).compact.uniq

Вид (хамл):

- @user_location.each do |user|
  %li= user.name

На этом этапе все повторяющиеся элементы массива удаляются (uniq).

Как я могу отобразить количество повторяющихся элементов в массиве? Например: если мой массив имеет

Один два два три четыре

Тогда мне нужно показать

Один Два (2) Три Четыре

0
Merkelst 2 Мар 2018 в 18:16

4 ответа

Лучший ответ

Я ожидаю, что что-то вроде этого может работать:

# in the controller (this returns a hash)
@locations = Country.joins(:user).order(:name).group(:name).count

# in your view
- @locations.each do |name, count|
  %li
    = name
    = "(#{count})" if count > 1
3
spickermann 2 Мар 2018 в 15:28

Вы можете выполнить итерацию, используя each_with_object, считая элементы по мере их присвоения хеш-ключу. Например:

array = %w(One Two Two Three Four)

counts = array.each_with_object(Hash.new(0)) do |el, hash| 
  hash[el] += 1
end
# => {"One"=>1, "Two"=>2, "Three"=>1, "Four"=>1}

counts.map { |k, v| v > 1 ? "#{k} (#{v})" : k }
# => ["One", "Two (2)", "Three", "Four"]

Это похоже на то, что вы ищете? Если нет, или у вас есть какие-либо вопросы, дайте мне знать!

1
SRack 2 Мар 2018 в 15:37
%w[One Two Two Three Four].
  group_by{|x|x}.
  map{|k, v|[k,v.count>1?" (#{v.count})":nil]}.
  map(&:compact).
  map(&:join)
#⇒ ["One", "Two (2)", "Three", "Four"]
0
Aleksei Matiushkin 2 Мар 2018 в 15:39

Вам нужно group_by + map. Нравится:

array.group_by(&:itself).map do |k, v|
 { value: k, count: v.length }
end

У вас будет такой массив хэшей: {value: 'Two', count: 2}.

Вы можете вернуть данные любым желаемым способом. Однако гораздо лучше получать сгруппированные записи непосредственно из SQL.

2
nautgrad 2 Мар 2018 в 16:34