我有一个可以创建帖子的模型用户
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时,它现在变得模糊不清。这是指用户撰写的帖子还是用户收藏的帖子?
你如何解决这个问题?
答案 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