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.2.1"

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" }
  started = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  while (model = models.pop)
    define_lite_struct(model)
  end
  elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - started
  ActiveRecord::Base.logger.debug { "QuickRead: Defining quick models took #{elapsed.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



83
84
85
# File 'lib/activerecord/quick_read.rb', line 83

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 = @quick_read_lite ||= const_get(:Lite)
  klass.new(*klass.members.map { |member| attrs.fetch(member) { attrs[member.to_s] } })
end

#quick_readObject



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

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

#quick_readsObject



66
67
68
69
70
71
72
73
74
# File 'lib/activerecord/quick_read.rb', line 66

def quick_reads
  scope = current_scope || all
  klass = @quick_read_lite ||= const_get(:Lite)
  if scope.select_values.empty?
    connection.select_rows(scope.to_sql).map { |values| klass.new(*values) }
  else
    connection.select_all(scope.to_sql).map { |attrs| quick_build(attrs) }
  end
end