Sha256: 474733510c4096a9dc8b286759f9f0b1690235b975655412d1973fe88518723b

Contents?: true

Size: 1.53 KB

Versions: 1

Compression:

Stored size: 1.53 KB

Contents

# lib/firestore_orm/model.rb
require 'google/cloud/firestore'

module FirestoreOrm
  class Model
    attr_accessor :attributes

    def initialize(attributes = {})
      @attributes = attributes
    end

    def save
      collection_ref.document(id || SecureRandom.uuid).set(@attributes)
    end

    def update(attributes)
      collection_ref.document(id).update(attributes)
      @attributes.merge!(attributes)
    end

    def delete
      collection_ref.document(id).delete
    end

    def id
      @attributes[:id]
    end

    class << self
      def find(id)
        doc = collection_ref.document(id).get
        new(doc.data.merge(id: doc.document_id)) if doc.exists?
      end

      def where(conditions = {})
        query = collection_ref
        conditions.each do |field, value|
          query = query.where(field, '=', value)
        end
        query.get.map do |doc|
          new(doc.data.merge(id: doc.document_id))
        end
      end

      def first_or_create(conditions, attributes = {})
        where(conditions).first || create(attributes.merge(conditions))
      end

      def create(attributes = {})
        model = new(attributes)
        model.save
        model
      end

      def collection(collection_name = nil)
        @collection_name ||= collection_name || name.downcase.pluralize
      end

      private

      def collection_ref
        firestore.collection(@collection_name || name.downcase.pluralize)
      end

      def firestore
        @firestore ||= Google::Cloud::Firestore.new
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
firestore_orm-0.1.0 lib/firestore_orm/model.rb