Det skulle vara bättre att använda det första tillvägagångssättet (enskilda dokument) och använda en begränsad samling om möjligt, eftersom du inte vill ha snabbt växande samling (mongoid kommer att ha stöd för begränsade samlingar i 2.2, som skulle komma ut i helgen I gissa).
Det andra tillvägagångssättet (inbäddade dokument), måste du först hämta rotdokumentet för användaren och sedan gå igenom arrayen i applikationen för att hitta aktiviteten relaterad till inlägget du letar efter. Mongoid kan få det att se ut som att allt görs i db på grund av likheten i syntaxen när det gäller att hitta ett inbäddat dokument, men det upprepar verkligen arrayen.
Eftersom du redan har användar-id, aktivitets-id och aktivitetstyp innan du gör en förfrågan, och du inte vill att hela listan med aktiviteter för användaren ska hämtas från db när du letar efter en viss aktivitet, kommer jag att föredra första fallet. Det skulle vara mycket mindre beräkningar (sökning) i applikationen och det kommer att bli mycket mindre nätverkstrafik.
Med individuella dokument tillvägagångssätt skulle det vara bra om du också skapar ett unikt index på user_id, activity_id, activity_type. Det hjälper dig att innehålla antalet dokument. Du kan ha unikhetsvalideringen (extra fråga), men det skulle mestadels vara onödigt om du har det unika indexet. Den enda fördelen med validering kommer att vara ett valideringsfel om det finns dubbletter, men index ignorerar dubblettposter tyst om du inte fortsätter i felsäkert läge.
Om du också vill att den historiska webbplatsaktiviteten ska bestå kan du ha strukturen som:
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