class CouchbaseOrm::Base

Constants

ID_LOOKUP
Metadata

Public Class Methods

[](*ids, **options)
Alias for: find_by_id
attribute(*names, **options) { |value| ... } click to toggle source
# File lib/couchbase-orm/base.rb, line 63
def attribute(*names, **options)
    @attributes ||= {}
    names.each do |name|
        name = name.to_sym

        @attributes[name] = options

        unless self.instance_methods.include?(name)
            define_method(name) do
                read_attribute(name)
            end
        end

        eq_meth = :"#{name}="
        unless self.instance_methods.include?(eq_meth)
            define_method(eq_meth) do |value|
                value = yield(value) if block_given?
                write_attribute(name, value)
            end
        end
    end
end
attributes() click to toggle source
# File lib/couchbase-orm/base.rb, line 86
def attributes
    @attributes ||= {}
end
bucket() click to toggle source
# File lib/couchbase-orm/base.rb, line 51
def bucket
    @bucket ||= Connection.bucket
end
bucket=(bucket) click to toggle source
# File lib/couchbase-orm/base.rb, line 47
def bucket=(bucket)
    @bucket = bucket
end
connect(**options) click to toggle source
# File lib/couchbase-orm/base.rb, line 43
def connect(**options)
    @bucket = ::Libcouchbase::Bucket.new(**options)
end
exists?(id) click to toggle source
# File lib/couchbase-orm/base.rb, line 119
def exists?(id)
    !bucket.get(id, quiet: true).nil?
end
Also aliased as: has_key?
find(*ids, **options) click to toggle source
# File lib/couchbase-orm/base.rb, line 90
def find(*ids, **options)
    options[:extended] = true
    options[:quiet] ||= false

    ids = ids.flatten.select { |id| id.present? }
    if ids.empty?
        return nil if options[:quiet]
        raise Libcouchbase::Error::EmptyKey, 'no id(s) provided'
    end

    record = bucket.get(*ids, **options)
    records = record.is_a?(Array) ? record : [record]
    records.map! { |record|
        if record
            self.new(record)
        else
            false
        end
    }
    records.select! { |rec| rec }
    ids.length > 1 ? records : records[0]
end
find_by_id(*ids, **options) click to toggle source
# File lib/couchbase-orm/base.rb, line 113
def find_by_id(*ids, **options)
    options[:quiet] = true
    find(*ids, **options)
end
Also aliased as: []
has_key?(id)
Alias for: exists?
new(model = nil, ignore_doc_type: false, **attributes) { |self| ... } click to toggle source

Add support for libcouchbase response objects

Calls superclass method
# File lib/couchbase-orm/base.rb, line 127
def initialize(model = nil, ignore_doc_type: false, **attributes)
    @__metadata__   = Metadata.new

    # Assign default values
    @__attributes__ = ::ActiveSupport::HashWithIndifferentAccess.new({type: self.class.design_document})
    self.class.attributes.each do |key, options|
        default = options[:default]
        if default.respond_to?(:call)
            write_attribute key, default.call
        else
            write_attribute key, default
        end
    end

    if model
        case model
        when ::Libcouchbase::Response
            doc = model.value || raise('empty response provided')
            type = doc.delete(:type)
            doc.delete(:id)

            if type && !ignore_doc_type && type.to_s != self.class.design_document
                raise "document type mismatch, #{type} != #{self.class.design_document}"
            end

            @__metadata__.key = model.key
            @__metadata__.cas = model.cas

            # This ensures that defaults are applied
            @__attributes__.merge! doc
            clear_changes_information
        when CouchbaseOrm::Base
            clear_changes_information
            attributes = model.attributes
            attributes.delete(:id)
            super(attributes)
        else
            clear_changes_information
            super(attributes.merge(Hash(model)))
        end
    else
        clear_changes_information
        super(attributes)
    end

    yield self if block_given?

    run_callbacks :initialize
end
uuid_generator() click to toggle source
# File lib/couchbase-orm/base.rb, line 55
def uuid_generator
    @uuid_generator ||= IdGenerator
end
uuid_generator=(generator) click to toggle source
# File lib/couchbase-orm/base.rb, line 59
def uuid_generator=(generator)
    @uuid_generator = generator
end

Public Instance Methods

==(other) click to toggle source

Public: Overrides == to compare via class and entity id.

other - Another object to compare to

Returns a boolean.

# File lib/couchbase-orm/base.rb, line 269
def ==(other)
    case other
    when self.class
        hash == other.hash
    else
        false
    end
end
[](attr_name)
Alias for: read_attribute
[]=(attr_name, value)
Alias for: write_attribute
attribute(name) click to toggle source
# File lib/couchbase-orm/base.rb, line 223
def attribute(name)
    return self.id if ID_LOOKUP.include?(name)
    @__attributes__[name]
end
attribute=(name, value) click to toggle source
# File lib/couchbase-orm/base.rb, line 229
def attribute=(name, value)
    __send__(:"#{name}=", value)
end
attributes() click to toggle source

Add support for Serialization: guides.rubyonrails.org/active_model_basics.html#serialization

# File lib/couchbase-orm/base.rb, line 209
def attributes
    copy = @__attributes__.merge({id: id})
    copy.delete(:type)
    copy
end
attributes=(attributes) click to toggle source
# File lib/couchbase-orm/base.rb, line 215
def attributes=(attributes)
    attributes.each do |key, value|
        setter = :"#{key}="
        send(setter, value) if respond_to?(setter)
    end
end
eql?(other) click to toggle source

Public: Overrides eql? to use == in the comparison.

other - Another object to compare to

Returns a boolean.

# File lib/couchbase-orm/base.rb, line 260
def eql?(other)
    self == other
end
hash() click to toggle source

Public: Hashes identifying properties of the instance

Ruby normally hashes an object to be used in comparisons. In our case we may have two techincally different objects referencing the same entity id.

Returns a string representing the unique key.

# File lib/couchbase-orm/base.rb, line 251
def hash
    "#{self.class.name}-#{self.id}-#{@__metadata__.cas}-#{@__attributes__.hash}".hash
end
id() click to toggle source

Document ID is a special case as it is not stored in the document

# File lib/couchbase-orm/base.rb, line 179
def id
    @__metadata__.key || @id
end
id=(value) click to toggle source
# File lib/couchbase-orm/base.rb, line 183
def id=(value)
    raise 'ID cannot be changed' if @__metadata__.cas
    attribute_will_change!(:id)
    @id = value.to_s
end
read_attribute(attr_name) click to toggle source
# File lib/couchbase-orm/base.rb, line 189
def read_attribute(attr_name)
    @__attributes__[attr_name]
end
Also aliased as: []
read_attribute_for_serialization(name)
Alias for: attribute
to_model() click to toggle source

Public: Allows for access to ActiveModel functionality.

Returns self.

# File lib/couchbase-orm/base.rb, line 241
def to_model
    self
end
write_attribute(attr_name, value) click to toggle source
# File lib/couchbase-orm/base.rb, line 194
def write_attribute(attr_name, value)
    unless value.nil?
        coerce = self.class.attributes[attr_name][:type]
        value = Kernel.send(coerce.to_s, value) if coerce
    end
    attribute_will_change!(attr_name) unless @__attributes__[attr_name] == value
    @__attributes__[attr_name] = value
end
Also aliased as: []=