Class: ActiveRecord::Serialization::Serializer

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

Overview

:nodoc:

Direct Known Subclasses

JsonSerializer, XmlSerializer

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(record, options = {}) ⇒ Serializer

Returns a new instance of Serializer.



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

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

Instance Attribute Details

#optionsObject (readonly)

Returns the value of attribute options.



4
5
6
# File 'lib/active_record/serialization.rb', line 4

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


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

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.



16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/active_record/serialization.rb', line 16

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



30
31
32
33
34
35
# File 'lib/active_record/serialization.rb', line 30

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



37
38
39
# File 'lib/active_record/serialization.rb', line 37

def serializable_names
  serializable_attribute_names + serializable_method_names
end

#serializable_recordObject



73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/active_record/serialization.rb', line 73

def serializable_record
  returning(serializable_record = {}) do
    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



86
87
88
# File 'lib/active_record/serialization.rb', line 86

def serialize
  # overwrite to implement
end

#to_s(&block) ⇒ Object



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

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