如何创建正确的关联
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)
希望这会有所帮助 谢谢。
【讨论】:
我已经用更详细的信息编辑了我的答案,关于如何使用它在其他用户的提要/墙上书写。希望对您有所帮助。以上是关于如何创建正确的关联的主要内容,如果未能解决你的问题,请参考以下文章