Module: JsonRecord::EmbeddedDocument
- Defined in:
- lib/json_record/embedded_document.rb
Overview
Classes that include EmbeddedDocument can be used as the type for keys or many field definitions in Schema. Embedded documents are then extensions of the schema. In this way, complex documents represented in JSON can be deserialized as complex objects.
To define the schema for an embedded document, call schema.key or schema.many from the class definition.
Defined Under Namespace
Modules: ValidationCallbacks
Instance Attribute Summary collapse
-
#parent ⇒ Object
The parent object of the document.
Class Method Summary collapse
Instance Method Summary collapse
- #==(val) ⇒ Object
-
#[](name) ⇒ Object
Get a field from the schema with the specified name.
-
#[]=(name, value) ⇒ Object
Set a field from the schema with the specified name.
-
#attributes ⇒ Object
Get the attributes of the document.
-
#attributes=(attrs) ⇒ Object
Set all the attributes at once.
-
#attributes_before_type_cast ⇒ Object
Get the attribute values of the document before they were type cast.
- #eql?(val) ⇒ Boolean
- #equal?(val) ⇒ Boolean
- #hash ⇒ Object
-
#initialize(attrs = {}) ⇒ Object
Create an embedded document with the specified attributes.
- #inspect ⇒ Object
- #to_hash ⇒ Object
- #to_json(*args) ⇒ Object
-
#valid_with_callbacks? ⇒ Boolean
:nodoc:.
Instance Attribute Details
#parent ⇒ Object
The parent object of the document.
34 35 36 |
# File 'lib/json_record/embedded_document.rb', line 34 def parent @parent end |
Class Method Details
.included(base) ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# File 'lib/json_record/embedded_document.rb', line 8 def self.included (base) base.send :include, ActiveModel::AttributeMethods base.send :include, ActiveModel::Dirty base.send :include, ActiveModel::Validations base.send :include, AttributeMethods base.send :include, ActiveSupport::Callbacks base.define_callbacks :validation base.alias_method_chain(:valid?, :callbacks) base.extend ValidationCallbacks base.class_attribute :schema base.schema = Schema.new(base, nil) end |
Instance Method Details
#==(val) ⇒ Object
90 91 92 |
# File 'lib/json_record/embedded_document.rb', line 90 def == (val) eql?(val) end |
#[](name) ⇒ Object
Get a field from the schema with the specified name.
67 68 69 70 |
# File 'lib/json_record/embedded_document.rb', line 67 def [] (name) field = schema.fields[name.to_s] read_attribute(field, self) if field end |
#[]=(name, value) ⇒ Object
Set a field from the schema with the specified name.
73 74 75 76 |
# File 'lib/json_record/embedded_document.rb', line 73 def []= (name, value) field = schema.fields[name.to_s] || FieldDefinition.new(name, :type => value.class) write_attribute(field, value, self) end |
#attributes ⇒ Object
Get the attributes of the document.
44 45 46 |
# File 'lib/json_record/embedded_document.rb', line 44 def attributes @json_attributes.reject{|k,v| !schema.fields.include?(k)} end |
#attributes=(attrs) ⇒ Object
Set all the attributes at once.
49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/json_record/embedded_document.rb', line 49 def attributes= (attrs) attrs.each_pair do |name, value| field = schema.fields[name.to_s] || FieldDefinition.new(name, :type => value.class) setter = "#{name}=".to_sym if respond_to?(setter) send(setter, value) else write_attribute(field, value, self) end end end |
#attributes_before_type_cast ⇒ Object
Get the attribute values of the document before they were type cast.
62 63 64 |
# File 'lib/json_record/embedded_document.rb', line 62 def attributes_before_type_cast json_attributes_before_type_cast end |
#eql?(val) ⇒ Boolean
86 87 88 |
# File 'lib/json_record/embedded_document.rb', line 86 def eql? (val) val.class == self.class && val.attributes == attributes && val.parent == parent end |
#equal?(val) ⇒ Boolean
94 95 96 |
# File 'lib/json_record/embedded_document.rb', line 94 def equal? (val) eql?(val) end |
#hash ⇒ Object
98 99 100 |
# File 'lib/json_record/embedded_document.rb', line 98 def hash attributes.hash + parent.hash end |
#initialize(attrs = {}) ⇒ Object
Create an embedded document with the specified attributes.
37 38 39 40 41 |
# File 'lib/json_record/embedded_document.rb', line 37 def initialize (attrs = {}) @attributes = {} @json_attributes = {} self.attributes = attrs end |
#inspect ⇒ Object
102 103 104 |
# File 'lib/json_record/embedded_document.rb', line 102 def inspect "#<#{self.class.name} #{attributes.inspect}>" end |
#to_hash ⇒ Object
82 83 84 |
# File 'lib/json_record/embedded_document.rb', line 82 def to_hash @json_attributes end |
#to_json(*args) ⇒ Object
78 79 80 |
# File 'lib/json_record/embedded_document.rb', line 78 def to_json (*args) @json_attributes.to_json(*args) end |
#valid_with_callbacks? ⇒ Boolean
:nodoc:
106 107 108 109 110 |
# File 'lib/json_record/embedded_document.rb', line 106 def valid_with_callbacks? #:nodoc: run_callbacks(:validation) do valid_without_callbacks? end end |