所以这个让我有些困惑,这可能是不合理的,但无论如何我都想要一些输入。
我有一个rails 3.1.3应用程序,用户可以查看媒体文件。我想在他们的媒体观看方面记录他们的活动历史。目标是能够记录历史记录,以便我可以从用户或媒体中追踪它。获取user.history()和media.history()的数据,以显示用户访问的所有媒体以及访问特定媒体的所有用户,以及有关每笔交易的其他数据。
到目前为止,我能够提出合理满足这一要求的唯一方法是为每个事务创建一个历史对象,如下所示:
class history_item
belongs_to: media_object
belongs_to: user
(other transaction-specific data)
end
我担心的是,随着此应用程序的典型使用,数据库条目的数量将迅速增加。有没有更好的方法来解决我没有想到的这个问题?我对rails和大型Web应用程序开发都很陌生,而且我不完全确定这种事情是如何完成的。
答案 0 :(得分:0)
我会在Viewing
和User
之间创建一个MediaObject
类的模型作为HABTM模型。这使得实际结构比仅具有名为history
的关系更明显。如果您想要所描述的确切界面,您当然也可以为User#history
和MediaObject#history
添加方法。
class User
has_many :viewings
has_many :viewed_media_objects, :through => :viewings
end
class MediaObject
has_many :viewings
has_many :viewers, :through => :viewings
end
class Viewing
belongs_to :user
belongs_to :media_object
end
查询这些对象时,例如给定user = User.first
,如果您知道要在操作中迭代用户的viewed_media_objects
,则可以使用@user = User.include(:viewed_media_objects).find(params[:id])
确保rails与用户同时获取相关的查看和媒体对象。这样,您就不会收到大量的数据库调用。