Rails多个belongs_to赋值

Jam*_*ant 10 ruby belongs-to ruby-on-rails-3

特定

用户:

class User < ActiveRecord::Base
   has_many :discussions
   has_many :posts
end
Run Code Online (Sandbox Code Playgroud)

讨论:

class Discussion < ActiveRecord::Base
    belongs_to :user
    has_many :posts
end
Run Code Online (Sandbox Code Playgroud)

帖子:

class Post < ActiveRecord::Base
    belongs_to :user
    belongs_to :discussion 
end
Run Code Online (Sandbox Code Playgroud)

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

@post = current_user.posts.build(params[:post])
Run Code Online (Sandbox Code Playgroud)

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

Bea*_*rtz 12

保存并编辑讨论以及帖子

现有讨论

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

@post = current_user.posts.build(
          params[:post].merge(
            :discussion_id => existing_discussion.id
        ) 
Run Code Online (Sandbox Code Playgroud)

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


新讨论

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

class Post < ActiveRecord::Base
  belongs_to :user
  belongs_to :discussion
  accepts_nested_attributes_for :discussion
end
Run Code Online (Sandbox Code Playgroud)

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

@post.build_discussion
Run Code Online (Sandbox Code Playgroud)

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

form_for @post do |f|
  f.fields_for :discussion do |df|
    ...etc
Run Code Online (Sandbox Code Playgroud)


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


更好的关系

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

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
Run Code Online (Sandbox Code Playgroud)

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