我目前正在开展一个项目,我通过has_one关联附加设备保修(设备有一个保修,保修属于设备)。一切正常,除非我的一位同事建议我在device_warranty的device_warranty_ends属性上添加状态验证,以确保在设备有保修的情况下至少填充此字段。
然而问题是,现在,您无法在没有保修的情况下创建设备,这显然不是真实的生活情况,因为设备自然可以在没有保修的情况下存在。所以,我的问题是,只有在将device_warranty附加到设备时才能验证device_warranty_ends。
换句话说,创建设备不应该关心保修,除非有人确实将保修附加到设备(通过填写字段),然后我才应检查device_warranty_ends存在:是否。
感谢。
这是我目前的验证码:
class DeviceWarranty < ActiveRecord::Base
belongs_to :device
validates :warranty_ends_at, presence: true
end
class Device < ActiveRecord::Base
has_one :device_warranty
答案 0 :(得分:0)
您的问题是您使用has_one将保修分配给所有设备对象。您当然可以创建一个“保修”对象,该对象在程序中用于表示设备没有保修。
如果您的程序要求所有保修属于设备,您只需在保修中运行检查结束,以便只允许创建结束的保修。
答案 1 :(得分: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
答案 2 :(得分:0)
我找到了我的问题的答案,拒绝if:
accepts_nested_attributes_for :device_warranty, :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank?}}, :allow_destroy => true
基本上,如果字段为空,则拒绝验证,如果不是,则检查device_warranty_ends是否已填充。
感谢所有试图帮助我的人。