2

ActiveRecord モデルに動的なポリシー ロジックを追加するために、インスタンス レベルの検証を追加する方法を作成しようとしました。誰もこれを経験したことがありますか?私が検索したものはあまり役に立ちませんでした。これが私が思いついた解決策です。批評してください。

# This extension can be used to create instance-level validations. For example
# if you have an instance of 'user' you can do something like the following:
# @example:
#   user.custom_validation ->(scope) {
#     if scope.bad_logins >= scope.account.max_bad_logins
#       scope.errors.add :bad_logins, "too many bad logins for your account policy"
#     end
#   }
#   user.account.max_bad_logins = 5
#   user.bad_logins = 5
#   user.valid?   => false
#
module ActiveRecordExtension
  module CustomValidation

    def self.included(base)
      base.class_eval do
        attr_accessor :custom_validation
        validate :run_custom_validation
        send :include, InstanceMethods
      end
    end

    module InstanceMethods
      def run_custom_validation
        if custom_validation
          custom_validation.call(self)
        else
          true
        end
      end
    end

  end
end

ActiveRecord::Base.send :include, ActiveRecordExtension::CustomValidation
4

1 に答える 1