Rails验证has_one并属于关联

时间:2013-10-25 15:00:45

标签: ruby-on-rails validation associations

我目前正在开展一个项目,我通过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

3 个答案:

答案 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是否已填充。

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