Module: Jsonoid::Document

Defined in:
lib/jsonoid/errors.rb,
lib/jsonoid/fields.rb,
lib/jsonoid/document.rb,
lib/jsonoid/callbacks.rb,
lib/jsonoid/collection.rb

Defined Under Namespace

Modules: ClassMethods Classes: Errors, NotFound, NotPersisted, Scope

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



6
7
8
# File 'lib/jsonoid/document.rb', line 6

def included(base)
  base.extend(ClassMethods)
end

Instance Method Details

#destroyObject



77
78
79
80
81
82
83
84
85
86
87
# File 'lib/jsonoid/document.rb', line 77

def destroy
  errors.clear!

  trigger(:before_destroy)
  self.class.collection.delete(id)

  true
rescue NotFound => e
  errors.add(:id, e.message)
  false
end

#errorsObject



58
59
60
# File 'lib/jsonoid/document.rb', line 58

def errors
  @errors ||= Errors.new
end

#idObject



16
17
18
# File 'lib/jsonoid/document.rb', line 16

def id
  @_data[:_id]
end

#initialize(data = {}) ⇒ Object



11
12
13
14
# File 'lib/jsonoid/document.rb', line 11

def initialize(data={})
  @_data = {}
  update_attributes(data)
end

#new_record?Boolean

Returns:

  • (Boolean)


20
21
22
# File 'lib/jsonoid/document.rb', line 20

def new_record?
  id.new?
end

#saveObject



62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/jsonoid/document.rb', line 62

def save
  errors.clear!

  trigger(:validate)
  return false if errors.any?

  trigger(:before_save)
  self.class.collection.write(id, @_data.to_json)

  true
rescue NotPersisted => e
  errors.add(:id, e.message)
  false
end

#to_hashObject



89
90
91
# File 'lib/jsonoid/document.rb', line 89

def to_hash
  @_data.to_hash
end

#to_json(*args) ⇒ Object



97
98
99
# File 'lib/jsonoid/document.rb', line 97

def to_json(*args)
  @_data.to_json(*args)
end

#to_sObject



93
94
95
# File 'lib/jsonoid/document.rb', line 93

def to_s
  @_data.to_s
end

#trigger(type) ⇒ Object

Raises:

  • (ArgumentError)


3
4
5
6
7
8
9
# File 'lib/jsonoid/callbacks.rb', line 3

def trigger(type)
  raise ArgumentError, 'Type must be a Symbol' unless type.is_a? Symbol

  self.class.send("_#{type}_callbacks".to_sym).each do |callback|
    send(callback)
  end
end

#update_attributes(data) ⇒ Object

Raises:

  • (ArgumentError)


24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/jsonoid/document.rb', line 24

def update_attributes(data)
  raise ArgumentError, 'Data must be a valid Hash' unless data.is_a? Hash

  data.keys.each do |k|
    data[k.to_sym] = data.delete(k)
  end

  self.class.fields.each do |(name, type, default)|
    value = data.delete(name)

    if value.nil?
      @_data[name] = default ? default.dup : nil
    elsif type < Document
      if value.is_a?(Array) and default.is_a?(Array)
        @_data[name] = value.map do |v|
          v.is_a?(Hash) ? type.new(v) : v
        end
      elsif value.is_a?(Hash)
        @_data[name] = type.new(value)
      else
        @_data[name] = value
      end
    else
      @_data[name] = type.respond_to?(:parse) ? type.parse(value) : value
    end
  end

  if @_data[:id].nil?
    @_data[:_id] = ObjectId.parse(data[:_id])
  else
    save
  end
end