如何在Rails多对多关联中使用ActiveRecord::NestedAttributes保存关联数据
问题原因
默认情况下,Rails的嵌套属性处理has_many关联时,会优先在未保存的父对象(此处为Article)已有的关联记录中查找你传入的id对应的记录。因为此时Article还未创建、没有id,也没有绑定任何关联分类,所以触发找不到记录的报错。
解决方案
方案1:调整嵌套属性配置(适合需要同时修改分类属性的场景)
修改models/article.rb中的accepts_nested_attributes_for配置,增加update_only: true参数,允许嵌套属性直接关联全局已有的分类记录:
# models/article.rb Article < ApplicationRecord has_many :category_articles has_many :categories, through: :category_articles accepts_nested_attributes_for :categories, update_only: true end
同时调整创建时的传参格式,categories_attributes需要传入数组格式的属性集合:
# rails console category = Category.first article = Article.create(name: "country", categories_attributes: [{ id: category.id }])
方案2:嵌套中间表关联(更推荐纯关联场景)
多对多关联场景下,直接嵌套中间表CategoryArticle的写法更直观,不需要修改分类的嵌套配置:
- 修改Article模型配置:
# models/article.rb Article < ApplicationRecord has_many :category_articles has_many :categories, through: :category_articles accepts_nested_attributes_for :category_articles end
- 调整创建代码,直接传入中间表需要的分类id即可:
# rails console category = Category.first article = Article.create(name: "country", category_articles_attributes: [{ category_id: category.id }])
内容的提问来源于stack exchange,提问作者Samuel Da Costa
相关产品推荐
相关产品推荐

