コピペコードで快適生活

明日使えるソースを自分のために

ActiveRecordで固定の日時最小値チェックのバリデーションを入れる

#
# app/models/concerns/my_app/extend_validation.rb
# 複数のフィールドに対して一括でバリデーション設定できるようにするために
# バリデーションメソッドを追加するモジュール
#
module MyApp
  module ExtendValidation
    extend ActiveSupport::Concern

    module ClassMethods
      def validates_min_datetime_gteq(*args)
        options = args.extract_options!
        args.each do |key|
          validates key, min_datetime: (options.present? ? options : true)
        end
      end
    end
  end
end

# 
# app/validators/min_datetime_validator.rb
#
class MinDatetimeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    if value.present? && value < Time.zone.parse(Settings.validation.min_datetime)
      record.errors[attribute] << (
        options[:message] || I18n.t('errors.messages.on_or_after', {restriction: Settings.validation.min_datetime})
      )
    end
  end
end

参考にさせていただきました。
www.techscore.com

www.task-notes.com