如何创建正确的关联

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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) 

希望这会有所帮助 谢谢。

【讨论】:

我已经用更详细的信息编辑了我的答案,关于如何使用它在其他用户的提要/墙上书写。希望对您有所帮助。

以上是关于如何创建正确的关联的主要内容,如果未能解决你的问题,请参考以下文章

怎样在文件夹选项中创建关联

如何将单选按钮值与输入字段相关联

如何以及在哪里处理关联记录的更新过程?

使用 Rspec 测试“关联”的正确方法?

如何删除与另一个托管对象关联的托管对象

CakePHP 3如何使用REST以正确的方式保存相关关联1:N?