【问题标题】:Rails: why is calling `valid?` only validate some of associated record not all associated recordsRails:为什么调用“有效?”只验证一些关联记录而不是所有关联记录
【发布时间】:2016-12-15 06:26:40
【问题描述】:

我有一个模型Order,就像

# app/models/order.rb
class Order< ApplicationRecord
   has_one :detail
   has_one :extra
..
end

我有两个orders

order1 = Order.first
order1.detail #<OrderDetail:0x00 name: "abc", remark: 'test1'>
order1.extra  #<OrderExtra:0x00 email: nil, recipent: nil>

order2 = Order.second
order1.detail #<OrderDetail:0x00 name: "abc", remark: 'test1'>
order1.extra  #<OrderExtra:0x00 email: nil, recipent: "xyz">

当我调用order1.valid?order1.save! 时,它不会检查OrderExtra 验证并返回true。但是当我调用order2.valid?order2.save! 时,它会检查OrderExtra 验证。

order1.save! # true
order2.save! # ActiveRecord Invalid OrderExtra

我想知道 Rails 在调用 save! 时如何检查是否要检查相关验证以及背后的原因。

如果对此有任何额外要求,请告诉我。

【问题讨论】:

    标签: ruby-on-rails validation activerecord


    【解决方案1】:

    使用validates_associated 执行相关的模型验证

    class Book < ActiveRecord::Base
      has_many :pages
      belongs_to :library
    
      validates_associated :pages, :library
    end
    

    如果尚未分配关联,则此验证不会失败。如果要确保关联既存在又保证有效,还需要使用validates_presence_of

    class Library < ActiveRecord::Base
     has_many :books
     validates_presence_of :name
    end
    

    【讨论】:

    • 谢谢这对我有帮助。但我更想知道 rails 决定验证相关记录的原因?在我的情况下,它验证一个,同时丢弃另一个订单的检查。
    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多