0

我目前正在从事一个项目,我通过 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
4

3 回答 3

0

我找到了我的问题的答案,如果:

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

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

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

于 2013-10-25T18:32:23.617 回答
0

您可以在模型中实现自定义验证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
于 2013-10-25T15:18:09.550 回答
0

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

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

于 2013-10-25T15:03:57.127 回答