module Aerogel::Db

Attributes

environment[RW]

List of registered models

models[RW]

List of registered models

Public Class Methods

clear!() click to toggle source

Clears database.

# File lib/aerogel/core/db.rb, line 43
def self.clear!
  puts "* clearing database"
  models.each do |model_class|
    puts "** destroing all objects in #{model_class.name}"
    model_class.destroy_all
  end
  puts "* purging database"
  Mongoid.purge!
end
migrate!() click to toggle source

Perform database migration

# File lib/aerogel/core/db.rb, line 37
def self.migrate!
  create_indexes!
end
registered( app ) click to toggle source

Registers and configures database access

# File lib/aerogel/core/db.rb, line 15
def self.registered( app )
  self.environment = app.environment
  raise "Database connection is not configured in your application's config/*" if Aerogel.config.db.nil?
  Mongoid.configure do |config|
    config.sessions = {
      default: { hosts: Aerogel.config.db.hosts, database: Aerogel.config.db.name }
    }
    config.options = {
      raise_not_found_error: false
    }
  end
  load_models

  # register reloader
  setup_reloader(app) if Aerogel.config.aerogel.reloader

  # disable [deprecated] warning in Mongoid method calls
  I18n.enforce_available_locales = false if defined? I18n
end
seed!() click to toggle source

Seeds database.

# File lib/aerogel/core/db.rb, line 55
def self.seed!
  load_and_process_seeds!
end

Private Class Methods

create_indexes!() click to toggle source

Create database indexes for all models

# File lib/aerogel/core/db.rb, line 99
def self.create_indexes!
  models.each do |model_class|
    puts "* creating/updating indexes for: #{model_class.name}"
    model_class.create_indexes
  end
end
filename_to_model( filename ) click to toggle source

Returns class object inferred from filename.

# File lib/aerogel/core/db.rb, line 167
def self.filename_to_model( filename )
  filename.chomp('.rb').split("/").map(&:camelize).join("::").constantize
end
humanize_seed_keys( obj_keys ) click to toggle source

Returns humanized search condition.

# File lib/aerogel/core/db.rb, line 161
def self.humanize_seed_keys( obj_keys )
  obj_keys.map{|k,v| "#{k}:'#{v}'"}.join(', ')
end
load_and_process_seeds!() click to toggle source

Loads and processes seed files.

# File lib/aerogel/core/db.rb, line 108
def self.load_and_process_seeds!
  seed_files = Aerogel.get_resource_list( 'db/seed', '*.seed', environment )
  seed_files.each do |seed_file|
    begin
      load_and_process_single_seed! seed_file
    rescue => e
      puts "!!! Failed to process seed: #{seed_file}"
      puts "!!! #{e}"
    end
  end
end
load_and_process_single_seed!( seed_filename ) click to toggle source

Load and process a single seed file.

# File lib/aerogel/core/db.rb, line 122
def self.load_and_process_single_seed!( seed_filename )
  puts "* processing seeds from: #{seed_filename}"
  created_num = 0
  updated_num = 0
  seed = Configurator.new seed_filename
  raise ArgumentError, "'model' is not specified" if seed.model.nil?
  raise ArgumentError, "'find_by' is not specified" if seed.find_by.nil?
  seeds = seed.seeds || []
  raise ArgumentError, "'seeds' should be Array" unless seeds.is_a? Array

  seed.find_by = [ seed.find_by ] unless seed.find_by.is_a? Array
  seed.force = [ seed.force ] unless seed.force.is_a? Array
  seeds.each do |fields|
    obj_keys = Hash[ seed.find_by.map{|k| [k, fields[k]] } ]
    obj_where = seed.model.where( obj_keys )
    if obj_where.count > 1
      puts "!!! WARNING: more than one object found for: #{seed.model.name}: #{humanize_seed_keys obj_keys}"
      puts "    first found object is used."
    end
    obj = obj_where.first
    if obj
      # exclude default and key attributes
      fields.delete_if do |k,v|
        !seed.force.include?( k ) && ( !obj[k].nil? || obj_keys.include?(k) )
      end
      if fields.size > 0
        obj.update_attributes! fields
        updated_num += 1
      end
    else
      seed.model.create! fields
      created_num += 1
    end
  end
  puts " - #{created_num} created / #{updated_num} updated"
end
load_models() click to toggle source

Loads all models from the folder db/model/*

# File lib/aerogel/core/db.rb, line 63
def self.load_models
  reset!
  Aerogel.get_resource_list( 'db/model', '**/*.rb' ) do |full_filename, model_filename, path|
    # puts "** loading model: #{path} #{model_filename}"
    load full_filename
    # puts "** classify: #{class_name}"
    self.models << filename_to_model( model_filename )
  end
end
reset!(app = nil) click to toggle source

Resets models.

# File lib/aerogel/core/db.rb, line 75
def self.reset!(app = nil)
  self.models ||= []
  # reset model classes
  self.models.uniq.each do |model|
    model.parent.send(:remove_const, model.name.demodulize.to_sym)
  end
  self.models = []
end
setup_reloader(app) click to toggle source

Configures reloader for models.

# File lib/aerogel/core/db.rb, line 87
def self.setup_reloader(app)
  app.use Aerogel::Reloader,
  ->{ Aerogel.get_resource_list( "db/model", "**/*.rb" ) },
  group: :'db/model' do
    reset!(app)
    load_models
  end
end