Rails多个belongs_to赋值

特定

用户:

class User < ActiveRecord::Base has_many :discussions has_many :posts end 

讨论:

 class Discussion < ActiveRecord::Base belongs_to :user has_many :posts end 

post:

 class Post < ActiveRecord::Base belongs_to :user belongs_to :discussion end 

我目前正在控制器中初始化post

 @post = current_user.posts.build(params[:post]) 

我的问题是,如何设置/保存/编辑@post模型,以便设置post和讨论之间的关系?

保存并编辑讨论以及post

现有讨论

要将您正在构建的post与现有讨论相关联,只需将id合并到post params中

 @post = current_user.posts.build( params[:post].merge( :discussion_id => existing_discussion.id ) 

您必须在@post的表单中为讨论ID提供隐藏输入,以便保存关联。

新讨论

如果您想要与每个post一起构建新讨论并通过表单管理其属性,请使用accepts_nested_attributes

 class Post < ActiveRecord::Base belongs_to :user belongs_to :discussion accepts_nested_attributes_for :discussion end 

然后,在构建build_discussion后,必须使用build_discussion在控制器中构建讨论

 @post.build_discussion 

在您的表单中,您可以包含嵌套字段以供讨论

 form_for @post do |f| f.fields_for :discussion do |df| ...etc 

这将与post一起创建讨论。 有关嵌套属性的更多信息,请观看此优秀的railscast

更好的关系

此外,您可以使用has_many关联的:through选项来获得更一致的关系设置:

 class User < ActiveRecord::Base has_many :posts has_many :discussions, :through => :posts, :source => :discussion end class Discussion < ActiveRecord::Base has_many :posts end class Post < ActiveRecord::Base belongs_to :user belongs_to :discussion end 

像这样,用户与讨论的关系仅在Post模型中维护,而不是在两个地方。