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 = {}) ⇒ 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 = {}) ⇒ Serializer
Returns a new instance of Serializer.
8 9 10 |
# File 'lib/active_record/serialization.rb', line 8 def initialize(record, = {}) @record, @options = record, .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
48 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 |
# File 'lib/active_record/serialization.rb', line 48 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
.
18 19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/active_record/serialization.rb', line 18 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
32 33 34 35 36 37 |
# File 'lib/active_record/serialization.rb', line 32 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
39 40 41 |
# File 'lib/active_record/serialization.rb', line 39 def serializable_names serializable_attribute_names + serializable_method_names end |
#serializable_record ⇒ Object
75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/active_record/serialization.rb', line 75 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 |
#serialize ⇒ Object
88 89 90 |
# File 'lib/active_record/serialization.rb', line 88 def serialize # overwrite to implement end |
#to_s(&block) ⇒ Object
92 93 94 |
# File 'lib/active_record/serialization.rb', line 92 def to_s(&block) serialize(&block) end |