通过关联构建和创建相关对象:如何设置嵌套模型的外键?
我正在使用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。
- 并且,当您保存文章时,rails将首先validation文章和所有子对象。 这意味着
article.valid?
必须是真的才能保存任何记录。 - 由于文章在保存到db之前没有id,因此article_category_relationships中的article_id为空。 因此,
article.valid?
只要您需要同时创建新文章及其子对象,它将始终为false - 总结一下,这是rails的步骤:
- validation文章本身,成功!(注意:注意保存)
- 为每个article.articles_category_relationshipsvalidationarticles_category_relationship,没有提供article_id,失败!
你可以做什么
- 首先创建文章
- 为这篇创作的文章指定参数
- 用params更新