Bylo by lepší použít první přístup (jednotlivé dokumenty) a použít omezenou kolekci, pokud je to možné, protože nechcete mít rychle rostoucí kolekci (mongoid bude mít podporu pro omezené kolekce ve verzi 2.2, která by měla vyjít tento víkend I hádejte).
Druhý přístup (vložené dokumenty), budete muset nejprve načíst kořenový dokument pro uživatele a poté procházet pole v aplikaci, abyste našli aktivitu související s příspěvkem, který hledáte. Mongoid může vypadat, jako by se vše dělalo v db kvůli podobnosti syntaxe při hledání vloženého dokumentu, ale ve skutečnosti to iteruje pole.
Protože už máte user_id, activity_id a activity_type před zadáním dotazu a nechtěli byste, aby byl celý seznam aktivit pro uživatele načten z db, když hledáte konkrétní aktivitu, budu preferovat první případ. V aplikaci by bylo mnohem méně výpočtů (vyhledávání) a byl by mnohem menší provoz v síti.
S přístupem jednotlivých dokumentů by bylo skvělé, kdybyste také vytvořili jedinečný index na user_id, activity_id, activity_type. Pomůže vám obsahovat počet dokumentů. Můžete mít ověření jedinečnosti (dodatečný dotaz), ale to by bylo většinou zbytečné, pokud máte jedinečný index. Jedinou výhodou ověření bude chyba ověření, pokud existují duplikáty, ale index bude duplicitní položky ignorovat tiše, pokud nezůstanete v nouzovém režimu.
V případě, že chcete, aby byla zachována i historická aktivita na webu, můžete mít strukturu jako:
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