Sha256: 284f767103239eb7f7020294710fb236144bf006b094109e6ebb0dcdc0f2fa4e

Contents?: true

Size: 1.31 KB

Versions: 6

Compression:

Stored size: 1.31 KB

Contents

##
# Exact Column 为加密数据提供摘要索引。

module Unidom::Common::Concerns::ExactColumn

  extend ActiveSupport::Concern

  included do |includer|

    cattr_accessor :exact_column_names

  end

  module ClassMethods

    ##
    # 配置精确索引列。如:
    # class SomeModel
    #   include Unidom::Common::Concerns::ExactColumn
    #   exact_column :phone_number, :identification_number
    # end
    def exact_column(*names)

      exact_column_names = exact_column_names||[]
      exact_column_names += names

      names.each do |name|
        name = name.to_s
        instance_eval do
          scope :"#{name}_is", ->(value) { where "#{name}_exact_signature" => exact_signature(self, name, value) }
          before_save do send "#{name}_exact_signature=", self.class.exact_signature(self.class, name, send(name)) end
        end
      end

    end

    ##
    # 计算精确索引列的值。此方法被 exact_column 方法调用。
    def exact_signature(klass, name, value, secret_key_base: Rails.application.secrets[:secret_key_base])
      text = "#{secret_key_base}/#{klass.table_name}##{name}=#{value}"
      #text = "#{Rails.application.secrets[:secret_key_base]}@#{Rails.root}/#{klass.table_name}##{name}=#{value}"
      "#{Digest::MD5.digest(text)}#{Digest::SHA512.digest(text)}"
    end

  end

end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
unidom-common-3.0 app/models/unidom/common/concerns/exact_column.rb
unidom-common-2.1.2 app/models/unidom/common/concerns/exact_column.rb
unidom-common-2.1.1 app/models/unidom/common/concerns/exact_column.rb
unidom-common-2.1 app/models/unidom/common/concerns/exact_column.rb
unidom-common-2.0 app/models/unidom/common/concerns/exact_column.rb
unidom-common-1.11 app/models/unidom/common/concerns/exact_column.rb