这种关系不允许我通过用户对象创建帖子

时间:2014-04-27 18:02:43

标签: ruby-on-rails model relationship

我需要帮助在Rails 4.1中修复这种关系,

用户模型关系

has_and_belongs_to_many :blogs, join_table: 'blogs_users'
has_many :posts, through: :blogs

博客模型关系

has_many :posts

发布模型关系

belongs_to :blog
belongs_to :user

问题?

以下rails c中的工作原理 - 如何传入用户ID:

User.find_by_x(x).blogs.find_by_x(x).post.create(x)

该帖子是为附加过该博客的用户创建的,但由于此类链接的工作方式,只有blog_id传递给帖子而不是user_id我的关键博客和用户ID。

所以我想,为什么不通过用户对象创建帖子并传入博客ID。

User.find_by_x(x).posts.create(x, blog_id: y) # Where y represents a blog the user is associated with.

嗯,这一切都很好,并且我接受了这个错误:

ActiveRecord::HasManyThroughNestedAssociationsAreReadonly: Cannot modify association 'User#posts' because it goes through more than one other association.

我认为问题在于我有一个联接表,我说has_many :posts, through: blogs大多数人可能会认为"只需删除直通部分。"我怎么需要这种类型的关系,用户可以拥有许多博客和博客可以属于许多用户,帖子属于博客和用户,但用户可以有很多帖子....

有没有办法解决这个问题,以保持我的观念或......

2 个答案:

答案 0 :(得分:0)

你创建帖子的方式没有多大意义。

这是通常的做法:

blog = current_user.blogs.find(params[:blog_id])
post = blog.posts.create(params[:post])

respond_with(post)

答案 1 :(得分:-1)

这个问题的正确解决方案有两个方面,我需要确保博客和用户之间的关系与用户和博客相同,所以在我添加的博客模型中:

has_and_belongs_to_many :users, join_table: 'blogs_users'

然后我需要在帖子级别创建帖子,而不是用户级别。因此,我需要@user.posts.create()而不是@ user.posts,而不是Post.create(blog_id: x, user_id: x) 将正常工作(假设用户有2个博客,每个博客都有一个帖子,你会收回这两个帖子)