Sha256: 400bfb7f5e9e1f626e0076aeb22f0ad432f9433db0ea02f62043c6ae8b8c38ab

Contents?: true

Size: 1.69 KB

Versions: 13

Compression:

Stored size: 1.69 KB

Contents

module NinjaModel
  module Associations
    class HasOneAssociation < SingularAssociation

      def replace(record, save = true)
        raise_on_type_mismatch(record) if record
        load_target

        if target && target != record
          remove_target!(options[:dependent]) unless target.destroyed?
        end

        if record
          set_owner_attributes(record)
          set_inverse_instance(record)

          if owner.persisted? && save && !record.save
            nullify_owner_attributes(record)
            set_owner_attributes(target) if target
            raise RecordNotSaved, "Failed to save the new associated #{reflection.name}."
          end
        end

        self.target = record

      end

      def delete(method = options[:dependent])
        if load_target
          case method
          when :delete
            target.delete
          when :destroy
            target.destroy
          when :nullify
            target.update_attribute(reflection.foreign_key, nil)
          end
        end
      end

      private

      def set_new_record(record)
        replace(record, false)
      end

      def remove_target!(method)
        if method.in?([:delete, :destroy])
          target.send(method)
        else
          nullify_owner_attributes(target)

          if target.persisted? && owner.persisted? && !target.save
            set_owner_attributes(target)
            raise RecordNotSaved, "Failed to remove the existing associated #{reflection.name}.  The record failed to save when after its foreign key was set to nil."
          end
        end
      end

      def nullify_owner_attributes(record)
        record[reflection.foreign_key] = nil
      end
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
ninja-model-1.0.5 lib/ninja_model/associations/has_one_association.rb
ninja-model-1.0.4 lib/ninja_model/associations/has_one_association.rb
ninja-model-1.0.3 lib/ninja_model/associations/has_one_association.rb
ninja-model-1.0.2 lib/ninja_model/associations/has_one_association.rb
ninja-model-1.0.1 lib/ninja_model/associations/has_one_association.rb
ninja-model-1.0.0 lib/ninja_model/associations/has_one_association.rb
ninja-model-0.9.6 lib/ninja_model/associations/has_one_association.rb
ninja-model-0.9.5 lib/ninja_model/associations/has_one_association.rb
ninja-model-0.9.4 lib/ninja_model/associations/has_one_association.rb
ninja-model-0.9.3 lib/ninja_model/associations/has_one_association.rb
ninja-model-0.9.2 lib/ninja_model/associations/has_one_association.rb
ninja-model-0.9.1 lib/ninja_model/associations/has_one_association.rb
ninja-model-0.9.0 lib/ninja_model/associations/has_one_association.rb