Class: StoresInMongo::Builder

Inherits:
Object
  • Object
show all
Defined in:
lib/stores_in_mongo/builder.rb

Instance Method Summary collapse

Constructor Details

#initialize(model, field, data_type) ⇒ Builder

Returns a new instance of Builder.



4
5
6
7
8
# File 'lib/stores_in_mongo/builder.rb', line 4

def initialize(model, field, data_type)
  @model = model
  @field = field.to_s
  @data_type = data_type
end

Instance Method Details

#buildObject



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/stores_in_mongo/builder.rb', line 10

def build
  @model.class_attribute :mongo_data_field
  @model.mongo_data_field = @field

  document_methods = build_document_methods_module
  @model.instance_exec(document_methods, @data_type) do |document_methods, data_type|
    const_set("MongoDocumentMethods", document_methods)
    include self::MongoDocumentMethods

    before_save :save_document
    before_destroy :destroy_document

    mongo_klass = const_set("MongoDocument", Class.new)
    mongo_klass.include Mongoid::Document
    mongo_klass.include Mongoid::Timestamps
    mongo_klass.field self.mongo_data_field.to_sym, :type => data_type, default: data_type.try(:new)
  end
end

#build_document_methods_moduleObject



29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/stores_in_mongo/builder.rb', line 29

def build_document_methods_module
  mod = Module.new
  mod.include(StoresInMongo::DocumentMethods)
  mod.instance_exec(@model) do |model|
    define_method(model.mongo_data_field) do |reload = false|
      document(reload)[model.mongo_data_field]
    end

    define_method(model.mongo_data_field + "=") do |data|
      document[model.mongo_data_field] = data
    end
  end
  return mod
end