validate :start_time_is_before_end_time
def start_time_is_before_end_time
unless start_time.to_i < end_time.to_i
errors.add(:end_time, 'must come after start time')
end
end
Converting the values to epoch time and comparing isn’t terrible, but I just found a cool way to extract this out to a custom validator to make it simpler and more readable:
# app/models/model.rb
require "active_model/sequential_validator"
validates :start_time, :end_time, sequential: true
# lib/active_model/sequential_validator.rb
class SequentialValidator < ActiveModel::Validator
def validate record
values = options[:attributes].map do |attribute|
record.send(attribute)
end.compact
if values.sort != values
record.errors.add options[:attributes].last, "cannot be before #{options[:attributes].first}"
end
end
end
True, the actual validator code is not as easy to read I don’t think, but it takes some of the burden out of the model, and it also allows reusing the sequential validation in other models.(Thanks to botandrose and the calagator project for this cool piece of code.)
No comments:
Post a Comment