Seria melhor usar a primeira abordagem (documentos individuais) e usar uma coleção limitada, se possível, pois você não deseja ter uma coleção de crescimento rápido (o mongoid terá suporte para coleções limitadas em 2.2, que sairia neste fim de semana. acho).
A segunda abordagem (documentos incorporados), você precisará primeiro buscar o documento raiz para o usuário e, em seguida, percorrer o array no aplicativo para encontrar a atividade relacionada à postagem que você está procurando. O Mongoid pode fazer parecer que tudo é feito em db devido à semelhança de sintaxe ao encontrar um documento incorporado, mas está realmente iterando a matriz.
Como você já tem o user_id, activity_id e activity_type antes de fazer uma consulta, e você não gostaria que toda a lista de atividades para o usuário fosse recuperada do db quando você estiver procurando por uma determinada atividade, vou preferir o primeiro caso. Haveria muito menos cálculos (pesquisa) no aplicativo e muito menos tráfego de rede.
Com a abordagem de documentos individuais, seria ótimo se você também criasse um índice exclusivo em user_id, activity_id, activity_type. Ele irá ajudá-lo a conter o número de documentos. Você pode ter a validação de exclusividade (consulta extra), mas isso seria desnecessário se você tivesse o índice exclusivo. O único benefício da validação será um erro de validação se houver duplicatas, mas o índice ignorará as entradas duplicadas silenciosamente, a menos que você persista no modo de segurança.
Caso você também queira que a atividade do site histórico seja persistente, você pode ter a estrutura como:
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