与嵌套表单字段的条件关联无法正确验证

时间:2019-04-28 13:51:19

标签: ruby-on-rails validation nested-forms has-many belongs-to

Rails 6.0.0.beta3 Ruby 2.6.1

我在ItemVariant之间有两个模型关联,如下所示:

class Item < ApplicationRecord
...
  has_many :variants
  accepts_nested_attributes_for :variants,
                                reject_if: :all_blank,
                                allow_destroy: true

end

和以下变体模型:

class Variant < ApplicationRecord
  belongs_to :item, -> { where(kind: :article) }
end

如上所述,我们对belongs_to有一个条件关系,它取决于Item字段kind的值为article

问题: 创建具有嵌套item的表单字段的variant时,它会提高对kind: :article的期望,但会提高kind的所有其他值,例如kind: :novel 。 在Rails控制台上,我尝试手动创建

item = Item.create(kind: :article)
item.variants.create

...

item = Item.create(kind: :novel)
item.variants.create
it raises validation error 'should be of kind: :article only'

它可在控制台上运行,但不适用于嵌套的表单字段。 其他相关的已知问题案例:https://github.com/rails/rails/issues/25198

1 个答案:

答案 0 :(得分:0)

我建议在Variant模型中验证项目类型,而不是在where中验证belongs_to

因为您的情况Item.create!(kind: :novel).variants.create!引发了错误(我尝试时Item must exist)。

btw对此很感兴趣,并做了一个最小的测试仓库(https://github.com/localhostdotdev/bug/tree/belongs-to-where-and-accepts-nested-attributes)(虽然没有表格)。