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=(数组)以在关联之前保存产品。。。但是除了写更多的代码之外,我看不到其他任何东西。。。