Class: Mongoid::Max::Denormalize::OneToMany
- 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
#attach ⇒ Object
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| = inverse_klass.fields[field.to_s] klass.field "#{relation}_#{field}", type: .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__ |