2013-10-25 5 views
0

В настоящее время я работаю над проектом, в котором у меня есть гарантия, прикрепленная к устройству через ассоциацию has_one (у устройства есть одна гарантия и гарантия принадлежат устройству). Все работает отлично, за исключением того, что один из моих коллег предложил мне добавить подтверждение валидации на атрибут device_warranty_ends устройства_видимости, чтобы убедиться, что по крайней мере это поле было заполнено, если у устройства была гарантия.Rails Валидация для has_one и принадлежит ассоциации

Однако проблема заключается в том, что теперь вы не можете создать устройство без гарантии, и это, очевидно, не является реальной жизненной ситуацией, поскольку устройство может существовать без гарантии. Итак, мой вопрос заключается в том, как я могу проверить подлинность 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 
+0

Поделитесь своим текущим кодом проверки. – cortex

+0

@cortex добавил код – rii

ответ

0

Ваша проблема заключается ваше использование has_one назначить гарантии на все объекты устройств. Вы, безусловно, можете создать объект «Гарантия», который используется в программе, чтобы представить, что устройство не имеет гарантии.

Если ваша программа требует, чтобы все Гарантии принадлежали устройству, вы можете просто запустить проверку для целей в Гарантии, так что только Гарантии, которые заканчиваются, могут быть созданы.

+0

Как бы это сделать: «Вы можете создать объект« Гарантия », который используется в программе, чтобы представить, что устройство не имеет гарантии». Звучит как жизнеспособное решение. – rii

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 
0

Я нашел ответ на мой вопрос, используя, отклонить, если:

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

в основном, он отвергает проверки, если эти поля пустыми, и если они не проверяет, что device_warranty_ends заполнено.

Спасибо всем, кто пытался мне помочь.

Смежные вопросы