module S3Assets::Relations::ClassMethods

Public Instance Methods

asset_belongs_to(relation_name, options = {}) click to toggle source
Calls superclass method
# File lib/s3_assets/relations.rb, line 21
def asset_belongs_to(relation_name, options = {})
  options[:class_name] = ::S3Assets::Model.to_s
  related_doc_klass = options[:class_name].constantize
  field_name = "#{relation_name}_id".to_sym

  self.instance_eval do
    self.belongs_to(relation_name, options)

    self.send(:define_method, "#{field_name}=".to_sym) do |asset_id|
      asset_id = ::S3Assets::Relations::Helpers.proper_asset_id(asset_id, self)
      super(asset_id)
    end

    after_save do |doc|
      if doc.send("#{field_name}_changed?")
        old_related_doc_id = doc.send("#{field_name}_was")
        if old_related_doc_id.present? && old_related_doc_id.to_s != doc.send(field_name).to_s
          related_doc_klass.where(:_id => old_related_doc_id).destroy_all
        end
      end
    end

    after_destroy do |doc|
      related_doc_id = doc.send(field_name)
      related_doc_klass.where(:_id => related_doc_id).destroy_all if related_doc_id.present?
    end
  end
end
asset_has_and_belongs_to_many(relation_name, options = {}) click to toggle source
Calls superclass method
# File lib/s3_assets/relations.rb, line 50
def asset_has_and_belongs_to_many(relation_name, options = {})
  options[:class_name] = ::S3Assets::Model.to_s
  related_doc_klass = options[:class_name].constantize
  field_name = "#{relation_name.to_s.singularize}_ids".to_sym

  self.instance_eval do
    self.has_and_belongs_to_many(relation_name, options)

    self.send(:define_method, "#{field_name}=".to_sym) do |asset_ids|
      if asset_ids.present?
        asset_ids = asset_ids.reject(&:blank?).map do |asset_id|
          ::S3Assets::Relations::Helpers.proper_asset_id(asset_id, self)
        end
      end
      super(asset_ids)
    end

    after_save do |doc|
      if doc.send("#{field_name}_changed?")
        old_related_doc_ids = [doc.send("#{field_name}_was")].flatten.compact.map(&:to_s)
        new_related_doc_ids = [doc.send(field_name)].flatten.compact.map(&:to_s)
        removed_ids = old_related_doc_ids - new_related_doc_ids
        related_doc_klass.where(:_id.in => removed_ids).destroy_all if removed_ids.present?
      end
    end

    after_destroy do |doc|
      related_doc_ids = doc.send(field_name)
      related_doc_klass.where(:_id.in => related_doc_ids).destroy_all if related_doc_ids.present?
    end
  end
end