Как получить уникальные элементы в этом массиве?
С Помощью 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 в результирующий набор. Кто-нибудь знает как этого можно добиться?
6 ответов:
вы можете просто использовать метод
uniq
. Предполагая, что Ваш массивary
звоните:ary.uniq{|x| x.user_id}
и это вернет набор с уникальными
user_id
s.
Это должно работать для вас:
рассмотрим Table1 имеет столбец с именем активность которые могут иметь одинаковое значение в нескольких записях. Вот как вы будете извлекать только уникальные записи активность поле в Таблице 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
для тех, кто попал в это в будущем, Теперь вы можете использовать
Mongoid::Criteria#distinct
метод из источника для выбора только отдельных значений из базы данных:# Requires a Mongoid::Criteria Attendees.all.distinct(:user_id)
вы смотрели на эту страницу?
http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct
Это может сэкономить вам время?
например децибел.адреса.distinct ("почтовый индекс");
вместо использования массива, рассмотрите возможность использования либо a хэш или Set.
наборы ведут себя подобно массиву, только они содержат только уникальные значения и, под обложками, построены на хэшах. Наборы не сохраняют порядок, в котором элементы помещаются в них, в отличие от массивов. Хэши также не сохраняют порядок, но могут быть доступны через ключ, поэтому вам не нужно пересекать хэш, чтобы найти конкретный элемент.
Я предпочитаю использовать хэши. В приложение user_id может быть ключом и значение будет весь объект. Это автоматически удалит все дубликаты из хэша.
или, только извлечь уникальные значения из базы данных, как предложил Джон Баллинджер.
Ну, это немного грязный на вид. Но я думаю, что я получил его для работы с группой (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 %>