与同一模型的多个has_many关系

我有一个可以创建post的模型用户

User has_many :posts Post belongs_to :user 

但是,我还想让用户将post保存为书签。 所以我添加了以下内容:

 Bookmark belongs_to :post belongs_to :user User has_many :posts has_many :posts, :through => :bookmarks Post belongs_to :user has_many :posts, :through => :bookmarks 

这不可能是正确的,因为当我执行@ user.posts时,它现在是不明确的。 这是指用户撰写的post还是用户collections的post?

你是如何解决这个问题的?

你是如何解决这个问题的?

通过给你的协会唯一的名字。 并不是你不能毫不含糊地访问它们,而是你的第二个正在摧毁第一个。

不使用两个posts ,请使用bookmarked_posts进行第二次关联:

 has_many :bookmarked_posts, through: :bookmarks, source: :posts 

也许是这样的?

 User has_many :bookmarks has_many :posts, through: :bookmarks has_many :authored_posts, foreign_key: :author_id, class_name: 'Post' Bookmark belongs_to :post belongs_to :user Post belongs_to :author, class_name: 'User' has_many :bookmarks has_many :users, through: :bookmarks 

通过这种方式,您可以将由用户书写和书签的post分开。 您也可以对其进行设置,以便每当作者创建post时,它都可以自动获得用户的书签。 即

 class PostsController < ActionController::Base def create @post = @user.authored_posts.build(post_params) @user.posts << @post if @post.valid? # do good stuff else # do errors end end end 

作者和authored_posts之间存在强烈的1:N关系。 然后,使用Bookmark作为连接模型,用户和post之间存在较弱的N:M关系。 您可以使用上面的控制器代码添加创建的post,以便在创建它们时添加书签。 删除创作post上的书签只会将其从posts关系中删除,但不会删除authored_posts关系。

您无法使用相同的名称定义多个关系。

检查rails API 。 您应该能够指定:as:source