Lepiej byłoby zastosować pierwsze podejście (pojedyncze dokumenty) i jeśli to możliwe, użyć kolekcji ograniczonej, ponieważ nie chcesz mieć szybko rosnącej kolekcji (mongoid będzie miał obsługę kolekcji ograniczonych w wersji 2.2, która ukaże się w ten weekend). zgadnij).
Drugie podejście (dokumenty osadzone), musisz najpierw pobrać dokument główny dla użytkownika, a następnie przeszukać tablicę w aplikacji, aby znaleźć aktywność związaną z poszukiwanym postem. Mongoid może sprawiać wrażenie, jakby wszystko odbywało się w db ze względu na podobieństwo składni w znajdowaniu osadzonego dokumentu, ale tak naprawdę iteruje tablicę.
Ponieważ masz już user_id, activity_id i activity_type przed wykonaniem zapytania, a nie chcesz, aby cała lista aktywności użytkownika była pobierana z bazy danych, gdy szukasz określonej aktywności, wolę pierwszy przypadek. W aplikacji będzie znacznie mniej obliczeń (wyszukiwania) i będzie znacznie mniejszy ruch w sieci.
Przy podejściu do pojedynczych dokumentów byłoby świetnie, gdybyś stworzył również unikalny indeks na user_id, activity_id, activity_type. Pomoże Ci w ograniczeniu liczby dokumentów. Możesz mieć walidację unikatowości (dodatkowe zapytanie), ale byłoby to w większości niepotrzebne, jeśli masz unikalny indeks. Jedyną korzyścią z walidacji będzie błąd walidacji, jeśli istnieją duplikaty, ale indeks po cichu zignoruje zduplikowane wpisy, chyba że pozostaniesz w trybie awaryjnym.
Jeśli chcesz również zachować historyczną aktywność witryny, możesz mieć strukturę taką jak:
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