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

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...