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
模型中维护,而不是在两个地方。