Как получить уникальные элементы в этом массиве?

Использование Mongoid. К сожалению, Mongoid не позволяет выбирать уникальный/отличный! Получили эти результаты. Как видите, 7 результатов. Если вы внимательно посмотрите (на user_id), есть только 2 пользователя.

[
  #<Activity _id: 4cea6c4572357e00fa00011a, created_at: 2010-11-22 13:12:37 UTC, updated_at: 2010-11-22 13:12:37 UTC, action: "Attend", user_id: BSON::ObjectId('4cea2fb872357e00fa000025'), artist_id: nil, media_id: BSON::ObjectId('4cea447472357e00fa00009a')>, 
  #<Activity _id: 4cea6c3072357e00fa000116, created_at: 2010-11-22 13:12:16 UTC, updated_at: 2010-11-22 13:12:16 UTC, action: "Attend", user_id: BSON::ObjectId('4cea2fb872357e00fa000025'), artist_id: nil, media_id: BSON::ObjectId('4cea447472357e00fa00009a')>, 
  #<Activity _id: 4cea6bdd72357e00fa00010d, created_at: 2010-11-22 13:10:53 UTC, updated_at: 2010-11-22 13:10:53 UTC, action: "Attend", user_id: BSON::ObjectId('4cea2fb872357e00fa000025'), artist_id: nil, media_id: BSON::ObjectId('4cea447472357e00fa00009a')>, 
  #<Activity _id: 4cea46df72357e00fa0000a4, created_at: 2010-11-22 10:33:03 UTC, updated_at: 2010-11-22 10:33:03 UTC, action: "Attend", user_id: BSON::ObjectId('4cea2fb872357e00fa000025'), artist_id: nil, media_id: BSON::ObjectId('4cea447472357e00fa00009a')>, 
  #<Activity _id: 4cea40c572357e00fa00006f, created_at: 2010-11-22 10:07:01 UTC, updated_at: 2010-11-22 10:07:01 UTC, action: "Attend", user_id: BSON::ObjectId('4cea2fb872357e00fa000025'), artist_id: nil, media_id: BSON::ObjectId('4cea3c8b72357e00fa00005e')>, 
  #<Activity _id: 4cea3ca172357e00fa000062, created_at: 2010-11-22 09:49:21 UTC, updated_at: 2010-11-22 09:49:21 UTC, action: "Attend", user_id: BSON::ObjectId('4cea39b772357e00fa000046'), artist_id: nil, media_id: BSON::ObjectId('4cea3c8b72357e00fa00005e')>, 
  #<Activity _id: 4cea344a72357e00fa00003f, created_at: 2010-11-22 09:13:46 UTC, updated_at: 2010-11-22 09:13:46 UTC, action: "Attend", user_id: BSON::ObjectId('4cea2fb872357e00fa000025'), artist_id: nil, media_id: BSON::ObjectId('4cea306c72357e00fa000031')>
] 

Я смотрел и думал, что могу сделать что-то подобное, чтобы теперь мой массив выглядел так:

[
  #<Activity _id: 4cea6c4572357e00fa00011a, created_at: 2010-11-22 13:12:37 UTC, updated_at: 2010-11-22 13:12:37 UTC, action: "Attend", user_id: BSON::ObjectId('4cea2fb872357e00fa000025'), artist_id: nil, media_id: BSON::ObjectId('4cea447472357e00fa00009a')>, 
  #<Activity _id: 4cea3ca172357e00fa000062, created_at: 2010-11-22 09:49:21 UTC, updated_at: 2010-11-22 09:49:21 UTC, action: "Attend", user_id: BSON::ObjectId('4cea39b772357e00fa000046'), artist_id: nil, media_id: BSON::ObjectId('4cea3c8b72357e00fa00005e')>
]

Мне не интересно, какая комбинация результатов будет извлечена. Пока у меня есть уникальный user_id в результирующем наборе. Кто-нибудь знает, как это можно достичь?

Ответ 1

Вы можете просто использовать метод uniq. Предполагая, что ваш массив ary, вызовите:

ary.uniq{|x| x.user_id}

и это вернет набор с уникальным user_id s.

Ответ 2

Это должно сработать для вас:

Рассмотрим, что в таблице 1 есть столбец с именем activity, который может иметь одно и то же значение в более чем одной записи. Вот как вы будете извлекать ТОЛЬКО уникальные записи поля активность в таблице1.

#An array of multiple data entries
@table1 = Table1.find(:all) 

#extracts **activity** for each entry in the array @table1, and returns only the ones which are unique 

@unique_activities = @table1.map{|t| t.activity}.uniq 

Ответ 3

Для тех, кто это делает в будущем, теперь вы можете использовать метод Mongoid::Criteria#distinct из Origin для выбора только отдельных значений из базы данных:

# Requires a Mongoid::Criteria
Attendees.all.distinct(:user_id)

http://mongoid.org/en/mongoid/docs/querying.html (v3.1.0)

Ответ 5

Вместо использования массива рассмотрите возможность использования Hash или Set.

Наборы ведут себя аналогично массиву, только они содержат только уникальные значения, а под крышками - на хэшах. Наборы не сохраняют порядок, в который элементы помещаются в них, в отличие от массивов. Хэши не сохраняют порядок, но могут быть доступны через ключ, поэтому вам не нужно проходить хэш, чтобы найти определенный элемент.

Я пользуюсь хешей. В вашем приложении user_id может быть ключом, а значением будет весь объект. Это автоматически удалит любые дубликаты из хэша.

Или, только извлекайте уникальные значения из базы данных, как предположил Джон Бэллингер.

Ответ 6

Errr, это немного грязно в представлении. Но я думаю, что мне удалось работать с группой (http://mongoid.org/docs/querying/)

контроллер

@event_attendees = Activity.only(:user_id).where(:action => 'Attend').order_by(:created_at.desc).group

Вид

<% @event_attendees.each do |event_attendee| %>    
  <%= event_attendee['group'].first.user.first_name %>
<% end %>