Sha256: 93c67e02580a02a3a1574124128e63a449b711a322ea554bb162ce8ee9c5aa6e

Contents?: true

Size: 1.73 KB

Versions: 4

Compression:

Stored size: 1.73 KB

Contents

module MultiDB
  class Organization < ActiveRecord::Base
    connect_to_master
    
    has_many :hosts, :class_name => 'OrganizationHost', :inverse_of => :organization, :dependent => :destroy
    
    validates :code, :presence => true, :uniqueness => true
    before_validation :ensure_code
    
    scope :active, -> { where(:active => true) }
    
    def ensure_code
      if code.blank?
        return true unless name
        new_code = name.downcase.gsub(/[^-\w\d]+/, '-')
        self.code = new_code
        i = 2
        while self.class.where(:code => code, :active => true).first
          self.code = "#{new_code}#{i}"
          i += 1
        end
      end
    end
    
    def connect(set_env = false)
      ActiveRecord::Base.connect_to_organization(self, set_env)
    end
    
    def create_database
      if code =~ /^[-\w\d]+$/
        begin
          ActiveRecord::Base.connection.create_database("#{ActiveRecord::Base.configurations[Rails.env]['database']}_#{code}")
        rescue Exception => e
          if e.message =~ /Can't create database '(.*?)'; database exists/
            puts "Warning: database #{$1} already exists"
          else
            throw e
          end
        end
        
        connect
        
        ActiveRecord::Migration.suppress_messages do
          load "#{Rails.root}/db/schema_organization.rb"
        end
      end
    end
    
    def drop_database!
      if Rails.env.production?
        raise "Won't drop database in production mode for safety reasons."
      else
        if code =~ /^[-\w\d]+$/
          # watch for sql injection here
          ActiveRecord::Base.connection.drop_database("#{ActiveRecord::Base.configurations[Rails.env]['database']}_#{code}")
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
multidb-4.0.1 lib/multi_db/organization.rb
multidb-3.2.1 lib/multi_db/organization.rb
multidb-4.0.0 lib/multi_db/organization.rb
multidb-3.2.0 lib/multi_db/organization.rb