我有User
和Post
模型,关联one-to-many
。我尝试实施转发操作,在表has_and_belongs_to_many
中添加链接reposts
。
但我遇到了以下挑战:
1)发布到Feed,如下所示:
followed_users="SELECT followed_id FROM relationships WHERE follower_id = :user ";
replics_posts="SELECT micropost_id FROM replics_users WHERE user_id = (:user)"
reposts="SELECT post_id FROM reposts WHERE user_id = (:user)"
where("user_id IN(#{followed_users}) OR user_id= (:user) OR id IN(#{replics_posts}) OR id in (#{reposts})", user: user);
并按修改日期排序。重新发布类似的排序,从中间饲料中存在重新发布的情况。
2)没有额外的努力,粉丝不会看到转发用户。
这些问题可以通过辅助阵列解决,需要快速,但看起来很荒谬,非最佳解决方案。
我怎样才能摆脱这种情况?
P.S。我认为可以通过现场参考找到解决方案"内容"在同一领域的Post
模型中,另一个对象。然后重新发布操作将不需要单独的表,并且将仅包含一个新的Post
对象,其中包含指向原始帖子内容的指针。但是我不知道如何在Ruby on Rails中做到这一点。
感谢您的帮助!
答案 0 :(得分:0)
我纠正如下:
1)在Post
模型中添加了一个新字段repost_id
并引用了自己:
has_many: reposts, class_name: "Post", foreign_key: "repost_id", dependent:: destroy;
(与模型User
的关系未更改)
2)添加到Post
的控制器方法repost
def repost
orig_post=Micropost.find(params[:id]);
if(orig_post)
Micropost.create(user_id:current_user.id,
content: orig_post.content,
repost_id:orig_post.id);
respond_to do |format|
format.js
end
end
end
(不要忘记实现满足帖子的路由和验证创建)
结果是正确的行为操作模型重新发布,具有依赖关系并在Feed中正确显示。但遗憾的是,这种方法涉及在表格Posts
中将重复数据存储在"内容"字段。