Module: ActivityNotification::Association
- Extended by:
- ActiveSupport::Concern
- Included in:
- Notifiable, Notifier, ORM::Dynamoid::Notification, ORM::Dynamoid::Subscription, ORM::Mongoid::Notification, ORM::Mongoid::Subscription, Subscriber, Target
- Defined in:
- lib/activity_notification/orm/mongoid.rb,
lib/activity_notification/orm/dynamoid.rb,
lib/activity_notification/orm/active_record.rb
Class Method Summary collapse
-
.belongs_to_composite_xdb_record(name, _options = {}) ⇒ Object
Defines polymorphic belongs_to association using composite key with models in other database.
-
.belongs_to_polymorphic_xdb_record(name, _options = {}) ⇒ Object
Defines polymorphic belongs_to association with models in other database.
-
.filtered_by_association ⇒ Mongoid::Criteria<Notificaion>
Selects filtered notifications by associated instance.
-
.has_many_composite_xdb_records(name, options = {}) ⇒ Object
Defines polymorphic has_many association using composite key with models in other database.
-
.has_many_polymorphic_xdb_records(name, options = {}) ⇒ Object
Defines polymorphic has_many association with models in other database.
-
.has_many_records(name, options = {}) ⇒ ActiveRecord_AssociationRelation<Object>
Defines has_many association with ActivityNotification models.
Instance Method Summary collapse
-
#update(attributes) ⇒ Object
Defines update method as update_attributes method.
Class Method Details
.belongs_to_composite_xdb_record(name, _options = {}) ⇒ Object
Defines polymorphic belongs_to association using composite key with models in other database.
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 |
# File 'lib/activity_notification/orm/dynamoid.rb', line 21 def belongs_to_composite_xdb_record(name, = {}) association_name = name.to_s.singularize.underscore composite_field = "#{association_name}_key".to_sym field composite_field, :string associated_record_field = "#{association_name}_record".to_sym field associated_record_field, :string if ActivityNotification.config.store_with_associated_records && [:store_with_associated_records] self.instance_eval do define_method(name) do |reload = false| reload and self.instance_variable_set("@#{name}", nil) if self.instance_variable_get("@#{name}").blank? composite_key = self.send(composite_field) if composite_key.present? && (class_name = composite_key.split(ActivityNotification.config.composite_key_delimiter).first).present? object_class = class_name.classify.constantize self.instance_variable_set("@#{name}", object_class.where(id: composite_key.split(ActivityNotification.config.composite_key_delimiter).last).first) end end self.instance_variable_get("@#{name}") end define_method("#{name}=") do |new_instance| if new_instance.nil? self.send("#{composite_field}=", nil) else self.send("#{composite_field}=", "#{new_instance.class.name}#{ActivityNotification.config.composite_key_delimiter}#{new_instance.id}") self.send("#{associated_record_field}=", new_instance.to_json) if ActivityNotification.config.store_with_associated_records && [:store_with_associated_records] end self.instance_variable_set("@#{name}", nil) end define_method("#{association_name}_type") do composite_key = self.send(composite_field) composite_key.present? ? composite_key.split(ActivityNotification.config.composite_key_delimiter).first : nil end define_method("#{association_name}_id") do composite_key = self.send(composite_field) composite_key.present? ? composite_key.split(ActivityNotification.config.composite_key_delimiter).last : nil end end self._associated_composite_records.push(association_name.to_sym) end |
.belongs_to_polymorphic_xdb_record(name, _options = {}) ⇒ Object
Defines polymorphic belongs_to association with models in other database.
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 |
# File 'lib/activity_notification/orm/mongoid.rb', line 22 def belongs_to_polymorphic_xdb_record(name, = {}) association_name = name.to_s.singularize.underscore id_field, type_field = "#{association_name}_id", "#{association_name}_type" field id_field, type: String field type_field, type: String associated_record_field = "#{association_name}_record" field associated_record_field, type: String if ActivityNotification.config.store_with_associated_records && [:store_with_associated_records] self.instance_eval do define_method(name) do |reload = false| reload and self.instance_variable_set("@#{name}", nil) if self.instance_variable_get("@#{name}").blank? if (class_name = self.send(type_field)).present? object_class = class_name.classify.constantize self.instance_variable_set("@#{name}", object_class.where(id: self.send(id_field)).first) end end self.instance_variable_get("@#{name}") end define_method("#{name}=") do |new_instance| if new_instance.nil? then instance_id, instance_type = nil, nil else instance_id, instance_type = new_instance.id, new_instance.class.name end self.send("#{id_field}=", instance_id) self.send("#{type_field}=", instance_type) self.send("#{associated_record_field}=", new_instance.to_json) if ActivityNotification.config.store_with_associated_records && [:store_with_associated_records] self.instance_variable_set("@#{name}", nil) end end end |
.filtered_by_association ⇒ Mongoid::Criteria<Notificaion>
Selects filtered notifications by associated instance.
11 |
# File 'lib/activity_notification/orm/mongoid.rb', line 11 scope :filtered_by_association, ->(name, instance) { where("#{name}_id" => instance.present? ? instance.id : nil, "#{name}_type" => instance.present? ? instance.class.name : nil) } |
.has_many_composite_xdb_records(name, options = {}) ⇒ Object
Add dependent option
Defines polymorphic has_many association using composite key with models in other database.
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/activity_notification/orm/dynamoid.rb', line 67 def has_many_composite_xdb_records(name, = {}) association_name = [:as] || name.to_s.underscore composite_field = "#{association_name}_key".to_sym object_name = [:class_name] || name.to_s.singularize.camelize object_class = object_name.classify.constantize self.instance_eval do # Set default reload arg to true since Dynamoid::Criteria::Chain is stateful on the query define_method(name) do |reload = true| reload and self.instance_variable_set("@#{name}", nil) if self.instance_variable_get("@#{name}").blank? new_value = object_class.where(composite_field => "#{self.class.name}#{ActivityNotification.config.composite_key_delimiter}#{self.id}") self.instance_variable_set("@#{name}", new_value) end self.instance_variable_get("@#{name}") end end end |
.has_many_polymorphic_xdb_records(name, options = {}) ⇒ Object
Add dependent option
Defines polymorphic has_many association with models in other database.
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/activity_notification/orm/mongoid.rb', line 54 def has_many_polymorphic_xdb_records(name, = {}) association_name = [:as] || name.to_s.underscore id_field, type_field = "#{association_name}_id", "#{association_name}_type" object_name = [:class_name] || name.to_s.singularize.camelize object_class = object_name.classify.constantize self.instance_eval do define_method(name) do |reload = false| reload and self.instance_variable_set("@#{name}", nil) if self.instance_variable_get("@#{name}").blank? new_value = object_class.where(id_field => self.id, type_field => self.class.name) self.instance_variable_set("@#{name}", new_value) end self.instance_variable_get("@#{name}") end end end |
.has_many_records(name, options = {}) ⇒ ActiveRecord_AssociationRelation<Object>
Defines has_many association with ActivityNotification models.
17 18 19 |
# File 'lib/activity_notification/orm/mongoid.rb', line 17 def has_many_records(name, = {}) has_many_polymorphic_xdb_records name, end |
Instance Method Details
#update(attributes) ⇒ Object
Defines update method as update_attributes method
88 89 90 91 92 93 94 95 |
# File 'lib/activity_notification/orm/dynamoid.rb', line 88 def update(attributes) attributes_with_association = attributes.map { |attribute, value| self.class._associated_composite_records.include?(attribute) ? ["#{attribute}_key".to_sym, value.nil? ? nil : "#{value.class.name}#{ActivityNotification.config.composite_key_delimiter}#{value.id}"] : [attribute, value] }.to_h update_attributes(attributes_with_association) end |