与同一模型的多个has_many关系

时间:2013-09-09 02:22:30

标签: ruby-on-rails activerecord

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

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 个答案:

答案 0 :(得分:20)

  

你如何解决这个问题?

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

不要同时调用posts,而是使用bookmarked_posts作为第二个关联:

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

答案 1 :(得分: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

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

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关系中删除。

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

答案 2 :(得分:1)

我在此处所做的操作与以前的评论类似,但是成功地使用了df[0] = np.where(df[[0,1]].eq('').any(axis=1), df[0].astype(str)+df[1].astype(str), df[0].astype(str)+' ('+df[1].astype(str)+')') print (df) 0 1 0 Lab Id Lab Id 1 Collection Date Collection Date 2 Location Code 3 pH 4 Ag (µg/L) µg/L 5 Alkalinity (mg/L) mg/L 来区分用户和“后发作者”:

inverse_of

答案 3 :(得分:0)

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