Ruby on rails实现" repost"邮政模特的行动

时间:2015-01-29 09:54:51

标签: ruby-on-rails ruby activerecord associations

我有UserPost模型,关联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中做到这一点。

感谢您的帮助!

1 个答案:

答案 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中将重复数据存储在"内容"字段。