Class: Populator::Factory

Inherits:
Object
  • Object
show all
Defined in:
lib/populator/factory.rb

Overview

Builds multiple Populator::Record instances and saves them to the database

Constant Summary

DEFAULT_RECORDS_PER_QUERY =
1000

Class Method Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (Factory) initialize(model_class)

Use for_model instead of instatiating a record directly.



35
36
37
38
# File 'lib/populator/factory.rb', line 35

def initialize(model_class)
  @model_class = model_class
  @records = []
end

Class Method Details

+ (Object) for_model(model_class)

Fetches the factory dedicated to a given model class. You should always use this method instead of instatiating a factory directly so that a single factory is shared on multiple calls.



12
13
14
# File 'lib/populator/factory.rb', line 12

def self.for_model(model_class)
  @factories[model_class] ||= new(model_class)
end

+ (Object) remember_depth

Keep track of nested factory calls so we can save the remaining records once we are done with the base factory. This makes Populator more efficient when nesting factories.



27
28
29
30
31
32
# File 'lib/populator/factory.rb', line 27

def self.remember_depth
  @depth += 1
  yield
  @depth -= 1
  save_remaining_records if @depth.zero?
end

+ (Object) save_remaining_records

Find all remaining factories and call save_records on them.



17
18
19
20
21
22
# File 'lib/populator/factory.rb', line 17

def self.save_remaining_records
  @factories.values.each do |factory|
    factory.save_records
  end
  @factories = {}
end

Instance Method Details

- (Object) build_records(amount, per_query, &block)

Builds multiple Populator::Record instances and calls save_records them when :per_query limit option is reached.



49
50
51
52
53
54
55
56
# File 'lib/populator/factory.rb', line 49

def build_records(amount, per_query, &block)
  amount.times do
    record = Record.new(@model_class, last_id_in_database + @records.size + 1)
    @records << record
    block.call(record) if block
    save_records if @records.size >= per_query
  end
end

- (Object) populate(amount, options = {}, &block)

Entry method for building records. Delegates to build_records after remember_depth.



41
42
43
44
45
# File 'lib/populator/factory.rb', line 41

def populate(amount, options = {}, &block)
  self.class.remember_depth do
    build_records(Populator.interpret_value(amount), options[:per_query] || DEFAULT_RECORDS_PER_QUERY, &block)
  end
end

- (Object) save_records

Saves the records to the database by calling populate on the current database adapter.



59
60
61
62
63
64
65
# File 'lib/populator/factory.rb', line 59

def save_records
  unless @records.empty?
    @model_class.connection.populate(@model_class.quoted_table_name, columns_sql, rows_sql_arr, "#{@model_class.name} Populate")
    @last_id_in_database = @records.last.id
    @records.clear
  end
end