13

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

User
 has_many :posts
Post
 belongs_to :user

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

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 时它现在是模棱两可的。那是指用户写的帖子还是用户收藏的帖子?

你如何解决这个问题?

4

4 回答 4

24

你如何解决这个问题?

通过为您的协会提供唯一的名称。并不是你不能明确地访问它们,而是你的第二个正在摧毁第一个。

而不是调用 both postsbookmarked_posts用于您的第二个关联:

has_many :bookmarked_posts, through: :bookmarks, source: :posts
于 2013-09-09T02:52:46.740 回答
4

也许是这样的?

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

通过这种方式,您可以将用户撰写和添加书签的帖子分开。您还可以对其进行设置,以便每当作者创建帖子时,它都可以自动被用户添加书签。IE

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

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

您不能使用相同的名称定义多个关系。

于 2013-09-09T02:56:42.027 回答
1

我在这里做了与之前评论类似的事情,但成功地用于inverse_of区分用户和“帖子作者”:

User
has_many :authored_posts, class_name: 'Post', inverse_of: 'author'
于 2020-07-21T05:58:05.323 回答
0

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

于 2013-09-09T03:01:44.470 回答