多态用于一次存储有关多个对象/实体的信息

时间:2017-01-15 12:38:12

标签: ruby-on-rails ruby ruby-on-rails-5

说,我有一个模型活动。我想用它作为我网站上发生的新闻或事件的模型,如:

  

用户创建了一篇文章

     

用户已编辑文章

     

用户已删除评论

     

用户上传了图片

始终与用户建立连接。以及其他内容:文章,新闻,评论,图片,个人资料。我该如何实现呢?我可以这样做:

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。

1 个答案:

答案 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

会返回相应的文章。