通过关联构建和创建相关对象:如何设置嵌套模型的外键?

我正在使用Ruby on Rails 3.1.0。 我试图保存一个嵌套模型,该模型具有用于存储父模型的外键的属性。 在父模型的创建时,我想将该属性值设置为父模型id值。

在我的模型中,我有:

 class Article  :article_category_relationships # Accept nested model attributes accepts_nested_attributes_for :articles_category_relationships end class Category  :article_category_relationships end # The join model: class ArticleCategoryRelationship < ActiveRecord::Base # Table columns are: # - article_id # - category_id # - user_id # - ... belongs_to :category belongs_to :article end 

在我看来,我有以下几点:

 ...    

在我的控制器中,我有:

 def create @article = Article.new(params[:article]) ... end 

在我的例子中, article_id (与ArticleCategoryRelationship嵌套模型相关)应该在创建@article.id后设置为@article.id值,问题是Ruby on Rails框架似乎没有在创建时设置该值。 简而言之,考虑到我的情况, 我想自动附加外键

只是要知道,提交表单时生成的params是:

 "article"=>{"title"=>"Sample title", "articles_category_relationships_attributes"=>[{"category_id"=>"8"}, {"category_id"=>"9"}, {"category_id"=>"10"}] } 

是否可以“自动”设置 嵌套模型 的外键article_id 如果是这样,我该怎么办?

尝试使用:

 @a_particular_article.article_category_relationships.build(params[:something]) 

您可以在此处查看更多信息,并且可能希望查看嵌套属性和validates_associated

在我看来,你不能这样做。

  • 如果要保存articles_category_relationships,则每个都需要一个article_id。
  • 并且,当您保存文章时,r​​ails将首先validation文章和所有子对象。 这意味着article.valid? 必须是真的才能保存任何记录。
  • 由于文章在保存到db之前没有id,因此article_category_relationships中的article_id为空。 因此, article.valid? 只要您需要同时创建新文章及其子对象,它将始终为false
  • 总结一下,这是rails的步骤:
    1. validation文章本身,成功!(注意:注意保存)
    2. 为每个article.articles_category_relationshipsvalidationarticles_category_relationship,没有提供article_id,失败!

你可以做什么

  1. 首先创建文章
  2. 为这篇创作的文章指定参数
  3. 用params更新