Class: Promiscuous::Subscriber::Model::Mongoid::EmbeddedDocs

Inherits:
Object
  • Object
show all
Includes:
Base
Defined in:
lib/promiscuous/subscriber/model/mongoid.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Base

#__promiscuous_eventual_consistency_update

Class Method Details

.__promiscuous_fetch_new(id) ⇒ Object



101
102
103
# File 'lib/promiscuous/subscriber/model/mongoid.rb', line 101

def self.__promiscuous_fetch_new(id)
  new
end

Instance Method Details

#__promiscuous_update(payload, options = {}) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/promiscuous/subscriber/model/mongoid.rb', line 67

def __promiscuous_update(payload, options={})
  old_embeddeds = options[:old_value]
  new_embeddeds = payload.attributes

  # XXX Reordering is not supported

  # find all updatable docs
  new_embeddeds.each do |new_e|
    old_e = old_embeddeds.select { |e| e.id.to_s == new_e['id'] }.first
    if old_e
      new_e['existed'] = true
      old_e.instance_variable_set(:@keep, true)

      payload = Promiscuous::Subscriber::Operation.new(new_e)
      old_e.__promiscuous_update(payload, :old_value => old_e)
    end
  end

  # delete all the old ones
  old_embeddeds.each do |old_e|
    old_e.destroy unless old_e.instance_variable_get(:@keep)
  end

  # create all the new ones
  new_embeddeds.reject { |new_e| new_e['existed'] }.each do |new_e|
    payload = Promiscuous::Subscriber::Operation.new(new_e)
    new_e_instance = payload.model.__promiscuous_fetch_new(payload.id)
    new_e_instance.__promiscuous_update(payload)
    options[:parent].__send__(old_embeddeds.[:name]) << new_e_instance
  end

  false
end