Sha256: 4aba097410f52a4277e7733a99cbd250d540b21e4469cb4aea9f3ec2a1ef66a3

Contents?: true

Size: 1.53 KB

Versions: 14

Compression:

Stored size: 1.53 KB

Contents

# encoding: utf-8
module Mongoid
  module Association
    module Referenced
      class HasOne

        # The Builder behavior for has_one associations.
        #
        # @since 7.0
        module Buildable

          # This method either takes an _id or an object and queries for the
          # inverse side using the id or sets the object after clearing the
          # associated object.
          #
          # @return [ Document ] A single document.
          def build(base, object, type = nil)
            if query?(object)
              if !base.new_record?
                execute_query(object, base)
              end
            else
              clear_associated(object)
              object
            end
          end

          private

          def clear_associated(object)
            if object && (associated = object.send(inverse))
              associated.substitute(nil)
            end
          end

          def query_criteria(object, base)
            crit = klass.where(foreign_key => object)
            with_polymorphic_criterion(crit, base)
          end

          def execute_query(object, base)
            query_criteria(object, base).limit(-1).first(id_sort: :none)
          end

          def with_polymorphic_criterion(criteria, base)
            if polymorphic?
              criteria.where(type => base.class.name)
            else
              criteria
            end
          end

          def query?(object)
            object && !object.is_a?(Mongoid::Document)
          end
        end
      end
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
mongoid-7.0.13 lib/mongoid/association/referenced/has_one/buildable.rb
mongoid-7.0.12 lib/mongoid/association/referenced/has_one/buildable.rb
mongoid-7.0.11 lib/mongoid/association/referenced/has_one/buildable.rb
mongoid-7.0.10 lib/mongoid/association/referenced/has_one/buildable.rb
mongoid-7.0.8 lib/mongoid/association/referenced/has_one/buildable.rb
mongoid-7.0.7 lib/mongoid/association/referenced/has_one/buildable.rb
mongoid-7.0.6 lib/mongoid/association/referenced/has_one/buildable.rb
mongoid-7.0.5 lib/mongoid/association/referenced/has_one/buildable.rb
mongoid-7.0.4 lib/mongoid/association/referenced/has_one/buildable.rb
mongoid-7.0.3 lib/mongoid/association/referenced/has_one/buildable.rb
mongoid-7.0.2 lib/mongoid/association/referenced/has_one/buildable.rb
mongoid-7.0.1 lib/mongoid/association/referenced/has_one/buildable.rb
mongoid-7.0.0 lib/mongoid/association/referenced/has_one/buildable.rb
mongoid-7.0.0.beta lib/mongoid/association/referenced/has_one/buildable.rb