Class: Mongoid::Max::Denormalize::OneToMany

Inherits:
Base
  • Object
show all
Defined in:
lib/mongoid/max/denormalize/one_to_many.rb

Instance Attribute Summary

Attributes inherited from Base

#fields, #inverse_meta, #klass, #meta, #options

Instance Method Summary collapse

Methods inherited from Base

#allowed_options, array_code_for, #fields_methods, #fields_only, #initialize, #inverse_klass, #inverse_relation, #relation, #unallowed_options, #verify

Constructor Details

This class inherits a constructor from Mongoid::Max::Denormalize::Base

Instance Method Details

#attachObject



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
57
58
59
60
61
62
63
64
65
66
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
# File 'lib/mongoid/max/denormalize/one_to_many.rb', line 8

def attach
  #
  # This side of the relation
  #
  fields.each do |field|
    field_meta = inverse_klass.fields[field.to_s]
    klass.field "#{relation}_#{field}", type: field_meta.try(:type)
  end

  klass.before_save :"denormalize_from_#{relation}"

  klass.class_eval "    def denormalize_from_\#{relation}\n      return true unless \#{meta.key}_changed?\n\n      fields = [\#{Base.array_code_for(fields)}]\n      if \#{meta.key}.nil?\n        fields.each do |field|\n          self.send(:\"\#{relation}_\\\#{field}=\", nil)\n        end\n      else\n        fields.each do |field|\n          self.send(:\"\#{relation}_\\\#{field}=\", \#{relation}.send(field))\n        end\n      end\n\n      true\n    end\n  EOM\n\n  #\n  # Other side of the relation\n  #\n  inverse_klass.around_save :\"denormalize_to_\#{inverse_relation}\"\n\n  inverse_klass.class_eval <<-EOM, __FILE__, __LINE__\n    def denormalize_to_\#{inverse_relation}(force = false)\n      unless changed? || force\n        yield if block_given?\n        return\n      end\n\n      fields = [\#{Base.array_code_for(fields)}]\n      fields_only = [\#{Base.array_code_for(fields_only)}]\n      methods = [\#{Base.array_code_for(fields_methods)}]\n      changed_fields = force ? fields_only.dup : (fields_only & changed.map(&:to_sym))\n\n      yield if block_given?\n\n      return if changed_fields.count == 0\n\n      to_set = {}\n      (changed_fields + methods).each do |field|\n        to_set[:\"\#{relation}_\\\#{field}\"] = send(field)\n      end\n\n      \#{inverse_relation}.update_all(to_set) unless to_set.empty?\n    end\n  EOM\n\n  inverse_klass.class_eval <<-EOM, __FILE__, __LINE__\n    def self.denormalize_to_\#{inverse_relation}!\n      all.entries.each do |obj|\n        obj.denormalize_to_\#{inverse_relation}(true)\n      end\n\n      nil\n    end\n  EOM\n\n\n  inverse_klass.around_destroy :\"denormalize_to_\#{inverse_relation}_destroy\"\n\n  inverse_klass.class_eval <<-EOM, __FILE__, __LINE__\n    def denormalize_to_\#{inverse_relation}_destroy\n      fields = [\#{Base.array_code_for(fields)}]\n\n      yield if block_given?\n\n      to_set = {}\n      fields.each do |field|\n        to_set[:\"\#{relation}_\\\#{field}\"] = nil\n      end\n\n      \#{inverse_relation}.update_all(to_set) unless to_set.empty?\n    end\n  EOM\nend\n", __FILE__, __LINE__