ruby – Rails mulitple belongs_to作业

特定

用户

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

讨论:

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

帖子:

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

我正在通过控制器初始化帖子

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

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

解决方法

保存和编辑讨论以及帖子

现有讨论

要将您正在构建的帖子与现有讨论相关联,请将该ID合并到帖子参数中

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

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

新讨论

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

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

然后,您在构建该帖子之后必须在build_discussion中在控制器中构建讨论

@post.build_discussion

在您的表单中,您可以包括嵌套字段进行讨论

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

这将与帖子一起进行讨论.更多关于嵌套属性,watch this excellent railscast

更好的关系

此外,您可以使用has_many association的:通过选项进行更一致的关系设置:

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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...