Module: ActiveRecord::QuickRead

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

Defined Under Namespace

Modules: LiteBase Classes: Railtie

Constant Summary collapse

VERSION =
"1.1.0"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.define_lite_struct(model) ⇒ Object



45
46
47
# File 'lib/activerecord/quick_read.rb', line 45

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

.define_lite_structsObject



33
34
35
36
37
38
39
40
41
42
43
# File 'lib/activerecord/quick_read.rb', line 33

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



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

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

  QuickRead.define_lite_struct(model)
rescue => e
  ActiveRecord::Base.logger.debug("QuickRead") { "Failed to define quick models #{e.message}" }
end

.modelsObject



29
30
31
# File 'lib/activerecord/quick_read.rb', line 29

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



77
78
79
# File 'lib/activerecord/quick_read.rb', line 77

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



56
57
58
59
# File 'lib/activerecord/quick_read.rb', line 56

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

#quick_build(attrs = {}) ⇒ Object



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

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

#quick_readObject



70
71
72
# File 'lib/activerecord/quick_read.rb', line 70

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

#quick_readsObject



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

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