说,我有一个模型活动。我想用它作为我网站上发生的新闻或事件的模型,如:
用户创建了一篇文章
用户已编辑文章
用户已删除评论
用户上传了图片
始终与用户建立连接。以及其他内容:文章,新闻,评论,图片,个人资料。我该如何实现呢?我可以这样做:
Activity
belongs_to :with_activity, polymorphic: true
belongs_to :user
Articles
has_many :activities, as :with_activity
News
has_many :activities, as :with_activity
但是当我创建活动时,我如何指定所有所涉及的ID?
例如: “用户已为文章添加评论”。这里有3个实体。用户ID通过“belongs_to:user”捕获。但是,通过“belongs_to:with_activity,polymorphic:true”捕获注释ID或文章,而不是两者。而我想要两个。或者更多,如果需要:
“用户已添加对文章图片的评论”。 - 4个实体,但只有2个ID是捕获。我需要存储他们所有的ID。 “polymorphic”允许仅存储单个实体的ID。
我怎样才能解决这个问题?我应该添加“belongs_to”:picture,:article,:comment等等到Activity?有更好的解决方案吗?
请注意,我不想为此使用gem。
答案 0 :(得分:1)
通常您只需要与with_activity
的关联。从那里你可以按照现有的belongs_to
关联(我假设评论belongs_to
一篇文章)。
例如:用户已添加文章评论:
# User creates a comment
comment = user.comments.create(article: article, text: 'Lorem ipsum')
# store the comment creation activity
activity = user.activities.create(with_activity: comment, activity: 'created')
现在您想知道渲染活动:
<%= activity.user.name %> # John Do
<%= activity.activity %> # created
<%= activity.with_activity.class.to_s %> # Comment
"<%= activity.with_activity.text %>" # "Lorem ipsum"
on <%= link_to 'Article', user.with_activity.article %> # on <Article Link>
或者您的其他示例:用户为文章图片添加了评论如果user_activity
是用户的活动而不是
user_activity.with_comment.picture.acticle
会返回相应的文章。