Sẽ tốt hơn nếu sử dụng cách tiếp cận đầu tiên (các tài liệu riêng lẻ) và sử dụng bộ sưu tập có giới hạn nếu có thể, vì bạn không muốn có bộ sưu tập đang phát triển nhanh chóng (mongoid sẽ có hỗ trợ cho các bộ sưu tập có giới hạn trong 2.2, sẽ ra mắt vào cuối tuần này. đoán).
Cách tiếp cận thứ hai (tài liệu nhúng), trước tiên bạn sẽ cần tìm nạp tài liệu gốc cho người dùng và sau đó duyệt qua mảng trong ứng dụng để tìm hoạt động liên quan đến bài đăng bạn đang tìm kiếm. Mongoid có thể làm cho nó trông giống như mọi thứ được thực hiện trong db do sự giống nhau về cú pháp trong việc tìm kiếm một tài liệu nhúng, nhưng nó thực sự lặp lại mảng.
Vì bạn đã có user_id, activity_id và activity_type trước khi thực hiện truy vấn và bạn sẽ không muốn toàn bộ danh sách các hoạt động của người dùng được truy xuất từ db khi bạn đang tìm kiếm một hoạt động cụ thể, tôi sẽ thích trường hợp đầu tiên hơn. Sẽ có ít tính toán hơn (tìm kiếm) trong ứng dụng và sẽ có ít lưu lượng mạng hơn nhiều.
Với cách tiếp cận tài liệu riêng lẻ, sẽ thật tuyệt nếu bạn cũng tạo một chỉ mục duy nhất trên user_id, activity_id, activity_type. Nó sẽ giúp bạn chứa số lượng tài liệu. Bạn có thể có xác nhận tính duy nhất (truy vấn bổ sung), nhưng điều đó hầu như không cần thiết nếu bạn có chỉ mục duy nhất. Lợi ích duy nhất của việc xác thực sẽ là lỗi xác thực nếu có các bản sao, nhưng chỉ mục sẽ im lặng bỏ qua các mục trùng lặp trừ khi bạn tiếp tục ở chế độ an toàn.
Trong trường hợp bạn cũng muốn hoạt động của di tích lịch sử được duy trì, bạn có thể có cấu trúc như:
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