mirror of
https://github.com/paper-trail-gem/paper_trail.git
synced 2022-11-09 11:33:19 -05:00
47 lines
1.6 KiB
Ruby
47 lines
1.6 KiB
Ruby
require 'active_support/json'
|
|
|
|
module PaperTrail
|
|
module Serializers
|
|
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 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 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
|