Иногда существуют проверки, которые являются довольно дорогими (например, проверки, которые должны выполнять запросы к базе данных).В этом случае вам нужно избегать использования valid?
, потому что он просто делает намного больше, чем вам нужно.
Существует альтернативное решение.Вы можете использовать validators_on
метод ActiveModel::Validations
.
validators_on (* attribute) public
Список всех валидаторов, которые используются для проверкиконкретный атрибут.
, в соответствии с которым вы можете вручную проверить нужные атрибуты
, например, мы хотим проверить только title
из Post
:
class Post < ActiveRecord::Base
validates :body, caps_off: true
validates :body, no_swearing: true
validates :body, spell_check_ok: true
validates presence_of: :title
validates length_of: :title, minimum: 30
end
Где no_swearing
и spell_check_ok
- сложные методы, которые чрезвычайно дороги.
Мы можем сделать следующее:
def validate_title(a_title)
Post.validators_on(:title).each do |validator|
validator.validate_each(self, :title, a_title)
end
end
, который будет проверять только атрибут title без вызовалюбые другие проверки.
p = Post.new
p.validate_title("")
p.errors.messages
#=> {:title => ["title can not be empty"]
note
Я не совсем уверен, что мы должны безопасно использовать validators_on
, поэтому я рассмотрел бы обработку исключения в здравом смысле в validates_title
.