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, = 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 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+ - 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 |