Би било по-добре да използвате първия подход (индивидуални документи) и да използвате ограничена колекция, ако е възможно, тъй като не искате да имате бързо нарастваща колекция (mongoid ще има поддръжка за ограничени колекции във 2.2, която ще излезе този уикенд I познайте).
При втория подход (вградени документи) ще трябва първо да извлечете основния документ за потребителя и след това да преминете през масива в приложението, за да намерите дейността, свързана с публикацията, която търсите. Mongoid може да изглежда така, сякаш всичко се прави в db поради сходството на синтаксиса при намирането на вграден документ, но наистина итерира масива.
Тъй като вече имате user_id, activity_id и activity_type, преди да направите заявка, и не бихте искали целият списък с дейности за потребителя да бъде извлечен от db, когато търсите конкретна дейност, аз ще предпочета първия случай. Ще има много по-малко изчисления (търсене) в приложението и ще има много по-малко мрежов трафик.
При подхода за индивидуални документи би било чудесно, ако създадете и уникален индекс за user_id, activity_id, activity_type. Това ще ви помогне да задържите броя на документите. Можете да имате проверка на уникалността (допълнителна заявка), но това би било най-вече ненужно, ако имате уникален индекс. Единственото предимство на валидирането ще бъде грешка при валидиране, ако има дубликати, но индексът ще игнорира дублиращите се записи тихо, освен ако не продължите да работите в безопасен режим.
В случай, че също така искате историческата активност на сайта да бъде запазена, можете да имате структура като:
class SiteActivity
include Mongoid::Document
include Mongoid::Timestamps
belongs_to :user
belongs_to :activity, polymorphic: true
index [:user_id, :activity_id, :activity_type], :background => true, :unique => true
field :last_access_time, :type => Time
# last_access_times just here for history, not used
field :last_access_times, :type => Array, :default => []
end
activity = SiteActivity.find_or_initialize_by(:user_id => current_user.id,
:activity_id => post.id, :activity_type => post.class)
time = Time.now.utc
activity.last_access_time = time
activity.last_access_times << time
activity.save