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.
6 7 8 |
# File 'lib/active_record/serialization.rb', line 6 def initialize(record, = {}) @record, @options = record, .dup end |
Instance Attribute Details
#options ⇒ Object (readonly)
Returns the value of attribute options.
4 5 6 |
# File 'lib/active_record/serialization.rb', line 4 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
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 = .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
.
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 [: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
30 31 32 33 34 35 |
# File 'lib/active_record/serialization.rb', line 30 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
37 38 39 |
# File 'lib/active_record/serialization.rb', line 37 def serializable_names serializable_attribute_names + serializable_method_names end |
#serializable_record ⇒ Object
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 |
#serialize ⇒ Object
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 |