module Mongoid::Relations::AutoSave::ClassMethods

Public Instance Methods

autosavable?(metadata) click to toggle source

Can the autosave be added?

@example Can the autosave be added?

Person.autosavable?(metadata)

@param [ Metadata ] metadata The relation metadata.

@return [ true, false ] If the autosave is able to be added.

@since 3.0.0

# File lib/mongoid/relations/auto_save.rb, line 100
def autosavable?(metadata)
  !autosaved_relations.include?(metadata.name) && !metadata.embedded?
end
autosave(metadata) click to toggle source

Set up the autosave behaviour for references many and references one relations. When the option is set to true, these relations will get saved automatically when the parent saved, if they are dirty.

@example Set up autosave options.

Person.autosave(metadata)

@param [ Metadata ] metadata The relation metadata.

@since 2.0.0.rc.1

# File lib/mongoid/relations/auto_save.rb, line 69
  def autosave(metadata)
    if metadata.autosave? && autosavable?(metadata)
      autosaved_relations.push(metadata.name)
      set_callback :save, :after, unless: :autosaved? do |document|
        # @todo: Durran: Remove with Rails 4 after callback termination.
        if before_callback_halted?
          self.before_callback_halted = false
        else
          __autosaving__ do
            if document.changed_for_autosave? || relation = document.relation_changed_for_autosave(metadata)
              relation = document.__send__(metadata.name) unless relation
              (relation.do_or_do_not(:in_memory) || Array.wrap(relation)).each do |doc|
                doc.save
              end if relation
            end
          end
        end
      end
    end
  end

  # Can the autosave be added?
  #
  # @example Can the autosave be added?
  #   Person.autosavable?(metadata)
  #
  # @param [ Metadata ] metadata The relation metadata.
  #
  # @return [ true, false ] If the autosave is able to be added.
  #
  # @since 3.0.0
  def autosavable?(metadata)
    !autosaved_relations.include?(metadata.name) && !metadata.embedded?
  end
end