Ruby rails 为 Post 的模型实施 "repost" 操作

Ruby on rails implementing "repost" action for Post's model

我有一个 UserPost 模型与关联 one-to-many。我试图实现一个 repost 动作,通过 table reposts.

添加一个 link has_and_belongs_to_many

但我遇到了以下挑战:

1) Post 加载如下:

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);

并按修改日期排序。 repost类似排序,从中有一种情况是repost在中间feed.

2) 无需额外努力,关注者看不到 reposts 用户。

这些问题可以通过需要快速的辅助数组来解决,但它看起来很荒谬且不是最佳解决方案。

我怎样才能摆脱困境?

P.S。我觉得可以参考在同一个字段,另一个对象上的Post模型中的字段"Content"找到解决方案。然后 repost 动作将不需要一个单独的 table 并且只包含一个新的 Post 对象和一个指向原始 post 内容的指针。但是我不知道如何在 Ruby on Rails.

中执行此操作

感谢您的帮助!

我更正如下:

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

(不要忘记实现满足 post 的路由和验证创建)

结果是一个正确的行为动作模型 post 具有依赖关系并在 Feed 中正确显示。但遗憾的是,这种方法涉及在 table Posts 字段中的 "Content" 中存储重复数据。