Sha256: d657a8ccee315deb15a31c5c0211eb3c22f2cf64b25c3a01172e1256e0dcb3af

Contents?: true

Size: 1.64 KB

Versions: 15

Compression:

Stored size: 1.64 KB

Contents

require "active_support/json"

module PaperTrail
  module Serializers
    # An alternate serializer for, e.g. `versions.object`.
    module JSON
      extend self # makes all instance methods become module methods as well

      def load(string)
        ActiveSupport::JSON.decode string
      end

      def dump(object)
        ActiveSupport::JSON.encode object
      end

      # Returns a SQL LIKE condition to be used to match the given field and
      # value in the serialized object.
      def where_object_condition(arel_field, field, value)
        # Convert to JSON to handle strings and nulls correctly.
        json_value = value.to_json

        # If the value is a number, we need to ensure that we find the next
        # character too, which is either `,` or `}`, to ensure that searching
        # for the value 12 doesn't yield false positives when the value is
        # 123.
        if value.is_a? Numeric
          arel_field.matches("%\"#{field}\":#{json_value},%").
            or(arel_field.matches("%\"#{field}\":#{json_value}}%"))
        else
          arel_field.matches("%\"#{field}\":#{json_value}%")
        end
      end

      # Returns a SQL LIKE condition to be used to match the given field and
      # value in the serialized `object_changes`.
      def where_object_changes_condition(arel_field, field, value)
        # Convert to JSON to handle strings and nulls correctly.
        json_value = value.to_json

        # Need to check first (before) and secondary (after) fields
        arel_field.matches("%\"#{field}\":[#{json_value},%").
          or(arel_field.matches("%\"#{field}\":[%,#{json_value}]%"))
      end
    end
  end
end

Version data entries

15 entries across 14 versions & 2 rubygems

Version Path
paper_trail-7.0.3 lib/paper_trail/serializers/json.rb
enju_leaf-1.2.1 vendor/bundle/ruby/2.3/gems/paper_trail-7.0.2/lib/paper_trail/serializers/json.rb
enju_leaf-1.2.1 vendor/bundle/ruby/2.3/gems/paper_trail-5.2.3/lib/paper_trail/serializers/json.rb
paper_trail-7.0.2 lib/paper_trail/serializers/json.rb
paper_trail-7.0.1 lib/paper_trail/serializers/json.rb
paper_trail-7.0.0 lib/paper_trail/serializers/json.rb
paper_trail-6.0.2 lib/paper_trail/serializers/json.rb
paper_trail-6.0.1 lib/paper_trail/serializers/json.rb
paper_trail-6.0.0 lib/paper_trail/serializers/json.rb
paper_trail-5.2.3 lib/paper_trail/serializers/json.rb
paper_trail-5.2.2 lib/paper_trail/serializers/json.rb
paper_trail-5.2.1 lib/paper_trail/serializers/json.rb
paper_trail-5.2.0 lib/paper_trail/serializers/json.rb
paper_trail-5.1.1 lib/paper_trail/serializers/json.rb
paper_trail-5.1.0 lib/paper_trail/serializers/json.rb