【问题标题】:Rails Validation for a has_one and belongs to association一个 has_one 和属于关联的 Rails 验证
【发布时间】:2013-10-25 15:00:44
【问题描述】:

我目前正在从事一个项目,我通过 has_one 关联将保修附加到设备(设备有一个保修,保修属于设备)。一切正常,除了我的一位同事建议我在 device_warranty 的 device_warranty_ends 属性上添加存在验证,以确保在设备有保修时至少填充此字段。

但问题是,现在,您无法创建没有保修的设备,这显然不是现实生活中的情况,因为设备可以在没有保修的情况下自然存在。所以,我的问题是,如何仅在将 device_warranty 连接到设备时验证 device_warranty_ends。

换句话说,创建设备不应该关心保修,除非有人确实为设备附加保修(通过填写字段),然后才应该检查 device_warranty_ends 是否存在:true。

谢谢。

这是我当前的验证码:

class DeviceWarranty < ActiveRecord::Base
belongs_to :device
validates :warranty_ends_at, presence: true
end

class Device < ActiveRecord::Base
  has_one :device_warranty

【问题讨论】:

  • 分享您当前的验证码。

标签: ruby-on-rails validation associations


【解决方案1】:

您的问题是您使用 has_one 将保修分配给所有设备对象。您当然可以创建一个“保修”对象,在程序中使用该对象来表示该设备没有保修。

如果您的程序要求所有保修都属于一个设备,您可以在保修中运行检查结束,以便只允许创建结束的保修。

【讨论】:

  • 我该怎么做:“您当然可以创建一个“保修”对象,在程序中使用该对象来表示该设备没有保修。”听起来是一个可行的解决方案。
【解决方案2】:

您可以在 Device 模型中实施自定义验证,检查它是否有保修。

如:

class Device < ActiveRecord::Base
  validate :warranty_must_exist

  def warranty_must_exist
    errors.add(:id, 'warranty must exist') if self.warranty.blank?
  end
end

【讨论】:

    【解决方案3】:

    我找到了我的问题的答案,如果使用,则拒绝:

    accepts_nested_attributes_for :device_warranty, :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank?}}, :allow_destroy => true
    

    基本上,如果字段为空白,它会拒绝验证,如果不是,它会检查 device_warranty_ends 是否已填写。

    感谢所有试图帮助我的人。

    【讨论】:

      猜你喜欢
      • 2017-07-13
      • 1970-01-01
      • 2013-05-12
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多