Module: ActiveRecord::QuickRead

Defined in:
lib/activerecord/quick_read.rb,
lib/activerecord/quick_read/railtie.rb,
lib/activerecord/quick_read/version.rb

Defined Under Namespace

Modules: LiteBase Classes: Railtie

Constant Summary collapse

VERSION =
"0.2.0"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.define_lite_struct(model) ⇒ Object



42
43
44
# File 'lib/activerecord/quick_read.rb', line 42

def self.define_lite_struct(model)
  model.const_set(:Lite, Struct.new(*model.column_names.map(&:to_sym)) { include(LiteBase) })
end

.define_lite_structsObject



30
31
32
33
34
35
36
37
38
39
40
# File 'lib/activerecord/quick_read.rb', line 30

def self.define_lite_structs
  return if QuickRead.models.empty?

  ActiveRecord::Base.logger.debug("QuickRead") { "Defining #{QuickRead.models.size} quick models" }
  time = Benchmark.realtime do
    while model = models.pop
      define_lite_struct(model)
    end
  end
  ActiveRecord::Base.logger.debug("QuickRead") { "Defining quick models took #{time.round(4)}s" }
end

.extended(model) ⇒ Object

Initialize the Lite models to be returned when using #quick_reads or called directly with #quick_build

Parameters:

  • model (ActiveRecord::Base)
    • class to get Lite functionality



19
20
21
22
23
24
# File 'lib/activerecord/quick_read.rb', line 19

def self.extended(model)
  super
  return if !model.table_name || model.abstract_class

  QuickRead.define_lite_struct(model)
end

.modelsObject



26
27
28
# File 'lib/activerecord/quick_read.rb', line 26

def self.models
  @models ||= []
end

Instance Method Details

#from_hash(attributes) ⇒ Object

Instantiate a new ActiveRecord object from a plain hash, marked as persisted, no changes, typecast

Parameters:

  • attributes (Hash)

Returns:

  • ApplicationRecord subclass



74
75
76
# File 'lib/activerecord/quick_read.rb', line 74

def from_hash(attributes)
  allocate.init_with_attributes(attributes_builder.build_from_database(attributes.stringify_keys!))
end

#inherited(model) ⇒ Object

This would be used when extended onto the ApplicationRecord, which many models inherit from Add the model to the queue to be run after initialization, since the models aren’t fully defined yet wait until connections are available, after rails init



53
54
55
56
# File 'lib/activerecord/quick_read.rb', line 53

def inherited(model)
  QuickRead.models << model
  super
end

#quick_build(attrs = {}) ⇒ Object



58
59
60
61
# File 'lib/activerecord/quick_read.rb', line 58

def quick_build(attrs = {})
  klass = const_get(:Lite)
  klass.new(*attrs.symbolize_keys!.values_at(*klass.members))
end

#quick_readObject



67
68
69
# File 'lib/activerecord/quick_read.rb', line 67

def quick_read
  current_scope.limit(1).quick_reads.first
end

#quick_readsObject



63
64
65
# File 'lib/activerecord/quick_read.rb', line 63

def quick_reads
  connection.select_all(current_scope.to_sql).map { |attrs| quick_build(attrs) }
end