【问题标题】:How to create a correct association如何创建正确的关联
【发布时间】:2017-01-09 21:15:56
【问题描述】:

告诉我如何在模型之间建立关系,如下所示:
- 你可以有很多帖子
- 其他用户可以在墙上的位置相互写信(如在社交网络中,即您可以自己创建记录,也可以在另一个用户页面上创建记录。

【问题讨论】:

    标签: ruby-on-rails associations


    【解决方案1】:

    您至少应该尝试自己做,但这里有一个解决方案:
    用户模型:

    User (id, name)
     has_many :posts
     has_many :comments
     has_many :commented_posts, through: :comments
    

    后模型:

    Post (id, content, user_id)
     belongs_to :user
     has_many :comments
    

    评论模型:

    Comment (id, content, post_id, user_id)
     belongs_to :user
     belongs_to :post
    

    【讨论】:

      【解决方案2】:

      如果您将帖子作为用户可以标记其他用户的媒介,以便帖子可以出现在他们的墙上。

      您可以明确地使用帖子给其他人写信。这就是任何社交平台的运作方式,同一帖子可以作为独立帖子,就像博客用户为他的追随者或特定社区发布的一样。

      我是一个类似社交的平台,在帖子上标记用户是在任何用户的墙上推送帖子的唯一方法。

      所以这里我们可以有以下实体。

      用户

      class User < ActiveRecord::Base
      
          has_many :usertags      
          has_many :posts         
      end
      

      发帖

      class Post < ApplicationRecord
      
          has_many :usertags, as: :usertagable
          belongs_to :user
          has_many :comments ,:as => :commentable 
      
      end
      

      用户标签

      class Usertag < ApplicationRecord
      
      
          belongs_to :user
          belongs_to :usertagable, :polymorphic => true
      
      end
      

      我已经为用户标签建立了多态关系,因为您可以扩展当前架构以涉及帖子上的 cmets 以及以下评论模型,可以使用多态关系提供服务。

      class Comment < ApplicationRecord
        # all the relations for the comment 
          belongs_to :user
          belongs_to :post
          belongs_to :commentable, :polymorphic => true
          has_many :comments, :as => :commentable 
          has_many :usertags, as: :usertagable  
      end
      

      评论又属于用户/作者,附有评论的帖子,评论也可以评论,因此它也可以属于可评论的。评论也可以像帖子一样提及用户。

      类似社交平台的平台,在帖子上标记用户是在任何用户的墙上推送帖子的唯一方法。

      现在您可以轻松获取属于特定用户的所有帖子以及用户标记、cmets、cmets 的作者。

      post_list = Post.eager_load(:followers, :user, :communities, :usertags => :user, :comments => [:usertags => :user]).select("*").where("user.id is ?", :user_id) 
      

      希望这会有所帮助 谢谢。

      【讨论】:

      • 我已经用更详细的信息编辑了我的答案,关于如何使用它在其他用户的提要/墙上书写。希望对您有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      相关资源
      最近更新 更多