lib/mongoid/history/options.rb in mongoid-history-0.8.2 vs lib/mongoid/history/options.rb in mongoid-history-0.8.3

- old
+ new

@@ -11,49 +11,48 @@ def scope trackable.collection_name.to_s.singularize.to_sym end def prepared - @prepared ||= begin - prepare_skipped_fields - prepare_formatted_fields - parse_tracked_fields_and_relations - options - end + return @prepared if @prepared + @prepared = options.dup + prepare_skipped_fields + prepare_formatted_fields + parse_tracked_fields_and_relations + @prepared end private def default_options - @default_options ||= - { on: :all, - except: %i[created_at updated_at], - tracker_class_name: nil, - modifier_field: :modifier, - version_field: :version, - changes_method: :changes, - scope: scope, - track_create: true, - track_update: true, - track_destroy: true, - format: nil } + { on: :all, + except: %i[created_at updated_at], + tracker_class_name: nil, + modifier_field: :modifier, + version_field: :version, + changes_method: :changes, + scope: scope, + track_create: true, + track_update: true, + track_destroy: true, + format: nil } end # Sets the :except attributes and relations in `options` to be an [ Array <String> ] # The attribute names and relations are stored by their `database_field_name`s # Removes the `nil` and duplicate entries from skipped attributes/relations list def prepare_skipped_fields # normalize :except fields to an array of database field strings - @options[:except] = Array(options[:except]) - @options[:except] = options[:except].map { |field| trackable.database_field_name(field) }.compact.uniq + @prepared[:except] = Array(@prepared[:except]) + @prepared[:except] = @prepared[:except].map { |field| trackable.database_field_name(field) }.compact.uniq end def prepare_formatted_fields formats = {} - if options[:format].class == Hash - options[:format].each do |field, format| + if @prepared[:format].class == Hash + @prepared[:format].each do |field, format| next if field.nil? field = trackable.database_field_name(field) if format.class == Hash && trackable.embeds_many?(field) @@ -66,37 +65,37 @@ formats[field] = format end end end - options[:format] = formats + @prepared[:format] = formats end def parse_tracked_fields_and_relations # case `options[:on]` # when `posts: [:id, :title]`, then it will convert it to `[[:posts, [:id, :title]]]` # when `:foo`, then `[:foo]` # when `[:foo, { posts: [:id, :title] }]`, then return as is - @options[:on] = Array(options[:on]) + @prepared[:on] = Array(@prepared[:on]) - @options[:on] = options[:on].map { |opt| opt == :all ? :fields : opt } + @prepared[:on] = @prepared[:on].map { |opt| opt == :all ? :fields : opt } - if options[:on].include?(:fields) - @options[:on] = options[:on].reject { |opt| opt == :fields } - @options[:on] = options[:on] | trackable.fields.keys.map(&:to_sym) - reserved_fields.map(&:to_sym) + if @prepared[:on].include?(:fields) + @prepared[:on] = @prepared[:on].reject { |opt| opt == :fields } + @prepared[:on] = @prepared[:on] | trackable.fields.keys.map(&:to_sym) - reserved_fields.map(&:to_sym) end - if options[:on].include?(:embedded_relations) - @options[:on] = options[:on].reject { |opt| opt == :embedded_relations } - @options[:on] = options[:on] | trackable.embedded_relations.keys + if @prepared[:on].include?(:embedded_relations) + @prepared[:on] = @prepared[:on].reject { |opt| opt == :embedded_relations } + @prepared[:on] = @prepared[:on] | trackable.embedded_relations.keys end - @options[:fields] = [] - @options[:dynamic] = [] - @options[:relations] = { embeds_one: {}, embeds_many: {} } + @prepared[:fields] = [] + @prepared[:dynamic] = [] + @prepared[:relations] = { embeds_one: {}, embeds_many: {} } - options[:on].each do |option| + @prepared[:on].each do |option| if option.is_a?(Hash) option.each { |k, v| split_and_categorize(k => v) } else split_and_categorize(option) end @@ -143,36 +142,36 @@ # `relations -> embeds_many` # # @param [ String ] field The database field name of field or relation to track # @param [ nil | Array <String | Symbol> ] field_options The tracked fields for embedded relations def categorize_tracked_option(field, field_options = nil) - return if options[:except].include?(field) + return if @prepared[:except].include?(field) return if reserved_fields.include?(field) field_options = Array(field_options) if trackable.embeds_one?(field) track_relation(field, :embeds_one, field_options) elsif trackable.embeds_many?(field) track_relation(field, :embeds_many, field_options) elsif trackable.fields.keys.include?(field) - @options[:fields] << field + @prepared[:fields] << field else - @options[:dynamic] << field + @prepared[:dynamic] << field end end def track_relation(field, kind, field_options) relation_class = trackable.relation_class_of(field) - @options[:relations][kind][field] = if field_options.blank? - relation_class.fields.keys - else - %w[_id] | field_options.map { |opt| relation_class.database_field_name(opt) } - end + @prepared[:relations][kind][field] = if field_options.blank? + relation_class.fields.keys + else + %w[_id] | field_options.map { |opt| relation_class.database_field_name(opt) } + end end def reserved_fields - @reserved_fields ||= ['_id', '_type', options[:version_field].to_s, "#{options[:modifier_field]}_id"] + @reserved_fields ||= ['_id', '_type', @prepared[:version_field].to_s, "#{@prepared[:modifier_field]}_id"] end end end end