Class: ActiveRecord::Serialization::Serializer

Inherits:
Object
  • Object
show all
Defined in:
lib/active_record/serialization.rb

Overview

:nodoc:

Direct Known Subclasses

XmlSerializer

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(record, options = nil) ⇒ Serializer

Returns a new instance of Serializer.



8
9
10
11
# File 'lib/active_record/serialization.rb', line 8

def initialize(record, options = nil)
  @record = record
  @options = options ? options.dup : {}
end

Instance Attribute Details

#optionsObject (readonly)

Returns the value of attribute options.



6
7
8
# File 'lib/active_record/serialization.rb', line 6

def options
  @options
end

Instance Method Details

#add_includes(&block) ⇒ Object

Add associations specified via the :includes option. Expects a block that takes as arguments:

+association+ - name of the association
+records+     - the association record(s) to be serialized
+opts+        - options for the association records


49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/active_record/serialization.rb', line 49

def add_includes(&block)
  if include_associations = options.delete(:include)
    base_only_or_except = { :except => options[:except],
                            :only => options[:only] }

    include_has_options = include_associations.is_a?(Hash)
    associations = include_has_options ? include_associations.keys : Array(include_associations)

    for association in associations
      records = case @record.class.reflect_on_association(association).macro
      when :has_many, :has_and_belongs_to_many
        @record.send(association).to_a
      when :has_one, :belongs_to
        @record.send(association)
      end

      unless records.nil?
        association_options = include_has_options ? include_associations[association] : base_only_or_except
        opts = options.merge(association_options)
        yield(association, records, opts)
      end
    end

    options[:include] = include_associations
  end
end

#serializable_attribute_namesObject

To replicate the behavior in ActiveRecord#attributes, :except takes precedence over :only. If :only is not set for a N level model but is set for the N+1 level models, then because :except is set to a default value, the second level model can have both :except and :only set. So if :only is set, always delete :except.



19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/active_record/serialization.rb', line 19

def serializable_attribute_names
  attribute_names = @record.attribute_names

  if options[:only]
    options.delete(:except)
    attribute_names = attribute_names & Array(options[:only]).collect { |n| n.to_s }
  else
    options[:except] = Array(options[:except]) | Array(@record.class.inheritance_column)
    attribute_names = attribute_names - options[:except].collect { |n| n.to_s }
  end

  attribute_names
end

#serializable_method_namesObject



33
34
35
36
37
38
# File 'lib/active_record/serialization.rb', line 33

def serializable_method_names
  Array(options[:methods]).inject([]) do |method_attributes, name|
    method_attributes << name if @record.respond_to?(name.to_s)
    method_attributes
  end
end

#serializable_namesObject



40
41
42
# File 'lib/active_record/serialization.rb', line 40

def serializable_names
  serializable_attribute_names + serializable_method_names
end

#serializable_recordObject



76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/active_record/serialization.rb', line 76

def serializable_record
  {}.tap do |serializable_record|
    serializable_names.each { |name| serializable_record[name] = @record.send(name) }
    add_includes do |association, records, opts|
      if records.is_a?(Enumerable)
        serializable_record[association] = records.collect { |r| self.class.new(r, opts).serializable_record }
      else
        serializable_record[association] = self.class.new(records, opts).serializable_record
      end
    end
  end
end

#serializeObject



89
90
91
# File 'lib/active_record/serialization.rb', line 89

def serialize
  # overwrite to implement
end

#to_s(&block) ⇒ Object



93
94
95
# File 'lib/active_record/serialization.rb', line 93

def to_s(&block)
  serialize(&block)
end