Class: ActiveRecord::Serialization::Serializer
- Inherits:
-
Object
- Object
- ActiveRecord::Serialization::Serializer
- Defined in:
- lib/active_record/serialization.rb
Overview
:nodoc:
Direct Known Subclasses
Instance Attribute Summary collapse
-
#options ⇒ Object
readonly
Returns the value of attribute options.
Instance Method Summary collapse
-
#add_includes(&block) ⇒ Object
Add associations specified via the
:includes
option. -
#initialize(record, options = nil) ⇒ Serializer
constructor
A new instance of Serializer.
-
#serializable_attribute_names ⇒ Object
To replicate the behavior in ActiveRecord#attributes,
:except
takes precedence over:only
. - #serializable_method_names ⇒ Object
- #serializable_names ⇒ Object
- #serializable_record ⇒ Object
- #serialize ⇒ Object
- #to_s(&block) ⇒ Object
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, = nil) @record = record @options = ? .dup : {} end |
Instance Attribute Details
#options ⇒ Object (readonly)
Returns the value of attribute options.
6 7 8 |
# File 'lib/active_record/serialization.rb', line 6 def @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 = .delete(:include) base_only_or_except = { :except => [:except], :only => [:only] } = include_associations.is_a?(Hash) associations = ? 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? = ? include_associations[association] : base_only_or_except opts = .merge() yield(association, records, opts) end end [:include] = include_associations end end |
#serializable_attribute_names ⇒ Object
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 [:only] .delete(:except) attribute_names = attribute_names & Array([:only]).collect { |n| n.to_s } else [:except] = Array([:except]) | Array(@record.class.inheritance_column) attribute_names = attribute_names - [:except].collect { |n| n.to_s } end attribute_names end |
#serializable_method_names ⇒ Object
33 34 35 36 37 38 |
# File 'lib/active_record/serialization.rb', line 33 def serializable_method_names Array([:methods]).inject([]) do |method_attributes, name| method_attributes << name if @record.respond_to?(name.to_s) method_attributes end end |
#serializable_names ⇒ Object
40 41 42 |
# File 'lib/active_record/serialization.rb', line 40 def serializable_names serializable_attribute_names + serializable_method_names end |
#serializable_record ⇒ Object
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 |
#serialize ⇒ Object
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 |