Ruby on rails 使用has\ MUN:到时联接模型中的验证失败
我的完整代码可以在 我有一个连接模型Ruby on rails 使用has\ MUN:到时联接模型中的验证失败,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我的完整代码可以在 我有一个连接模型ProductCategory,具有以下验证: validates :product, presence: true validates :category, presence: true 我的产品型号具有以下关联: has_many :product_categories has_many :categories, through: :product_categories 当我尝试创建具有类别的新产品时,调用@product.save出现以下故障: Va
ProductCategory
,具有以下验证:
validates :product, presence: true
validates :category, presence: true
我的产品
型号具有以下关联:
has_many :product_categories
has_many :categories, through: :product_categories
当我尝试创建具有类别的新产品时,调用@product.save控制器中的代码>出现以下故障:
Validation failed: Product categories is invalid
当我删除验证时,一切正常,连接模型也正确保存
我使用的是strong\u参数
,但我认为这不应该与这个问题相关。非常确定,您只需要更好地定义您的关系。我可能还是错过了一些,但希望你能理解
class Product < ActiveRecord::Base
include ActiveModel::ForbiddenAttributesProtection
validates :name, presence: true
validates :description, presence: true
validates :color_scheme, presence: true
belongs_to :color_scheme
has_many :product_categories, inverse_of: :product
has_many :categories, through: :product_categories
end
class ProductCategory < ActiveRecord::Base
belongs_to :product
belongs_to :category
validates_associated :product
validates_associated :category
# TODO work out why this causes ProductsController#create to fail
# validates :product, presence: true
# validates :category, presence: true
end
class Category < ActiveRecord::Base
has_many :product_categories, inverse_of: :category
has_many :products, through: :product_categories
end
类产品
这是回调链中的“竞速条件”
创建产品时,它在保存之前没有任何id,因此在ProductCategory
范围内没有product
Product.new(name: "modern times", category_ids:[1, 2]) #=> #<Product id: nil >
Product.new(名称:“现代”,分类号:[1,2])#=>#
在验证阶段(保存前),ProductCatgory
无法为其外键product\u id
分配任何id
这就是您进行关联验证的原因:因此验证发生在整个事务的范围内
更新:如评论中所述,您仍然无法确保产品/类别的存在。根据您为什么要这样做,有很多方法(例如通过某种形式直接访问ProductCategory)
- 您可以创建一个标志,让
验证:产品,状态:true,if::直接访问?
- 或者如果您只能更新它们:
validates:product,presence:true,on:“update”
- 首先创建产品(在products_controller中),然后添加类别
。。。但事实上,这些都是简单的@产品的折衷方案或变通办法。创建(参数)
在加入模型上指定的反向,以解决此问题:
简化示例:
class Product < ActiveRecord::Base
has_many :product_categories, :inverse_of => :product
has_many :categories, through: :product_categories
end
class Category < ActiveRecord::Base
has_many :product_categories, inverse_of: :category
has_many :products, through: :product_categories
end
class ProductCategory < ActiveRecord::Base
belongs_to :product
belongs_to :category
validates :product, presence: true
validates :category, presence: true
end
Product.new(:categories => [Category.new]).valid? # complains that the ProductCategory is invalid without inverse_of specified
类产品:产品
有多个:类别,通过::产品类别
结束
类类别[Category.new])。有效吗?#投诉ProductCategory无效,但未指定反向\u
改编自:您是否从ProductCategory
模型中删除了此验证\u关联的
,并尝试保存@product.save!因为这是没有必要的。是的,我试过了,但没用。好的,这是有道理的。但是当我在:product和:category上指定validates_关联时,这并不能阻止创建没有这些关联的ProductCategory。我已经更新了帖子以解决您的评论。哦,您还可以覆盖category_id=(数组)以在关联之前保存产品。。。但是除了写更多的代码之外,我看不到其他任何东西。。。