
рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░ред рдореИрдВ рд░реЗрд▓реНрд╕ рдбреЗрд╡рд▓рдкрд░ рдкрд░ рдПрдХ рд╢реБрд░реБрдЖрддреА (рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд) рд░реВрдмреА рд╣реВрдВред рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЙрддрдиреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдЬрд┐рддрдиреА рд╣рдо рдЪрд╛рд╣реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рд░рдЦрдиреЗ рдФрд░ рдЗрд╕реЗ рд╡реНрдпрд╛рдкрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, рдореИрдВ рдЦреБрдж рдХреЛ рд░реЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╡рд╛рдЧрдВрддреБрдХ рдорд╛рдирддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рд╣реА рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдкрд░ рдПрдХ рд▓реЗрдЦ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдиреЛрдЯреЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ред
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд░реАрдореЗрдХ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдХрд╛рд░реНрдп
рдХреБрдЫ рд╕рд╛рдорд╛рди рдмреЗрдЪрдиреЗ рд╡рд╛рд▓реА рдХрдВрдкрдирд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдПрдордбреАрдЬреА рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХрдВрдкрдирд┐рдпрд╛рдВ рдПрдХ рд╕рд╛рде рдХрдИ рдмреНрд░рд╛рдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд░рд╛рдВрдб рдХреЛ рдПрдХ рдЕрд▓рдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реАрдЖрд░рдПрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдХрдВрдкрдиреА рдЙрдк-рдбреЛрдореЗрди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЧрдИ рд╣реИ, рдФрд░ URL рд╕реЗ рдмреНрд░рд╛рдВрдб, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, URL company1.myapp.dev/brand1/ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо company1 рдФрд░ brand1 рдмреНрд░рд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдпрд╣ рд╕рдм рдореЙрдбрд▓ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, 2 рдореЙрдбрд▓реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рдерд╛: рдХрдВрдкрдиреА рдФрд░ рдмреНрд░рд╛рдВрдбред
рдХрдВрдкрдиреА
- db_user: string - DBMS рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо
- db_password: string - рдкрд╛рд╕рд╡рд░реНрдб
- db_host: string - DBMS рд╕рд░реНрд╡рд░ рдХрд╛ рдкрддрд╛
- db_port: рдкреВрд░реНрдгрд╛рдВрдХ - DBMS рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯ
- рдЙрдкрдбреЛрдореЗрди: рд╕реНрдЯреНрд░рд┐рдВрдЧ - рдХрдВрдкрдиреА рдХреЗ рд▓рд┐рдП рдЙрдкрдбреЛрдореЗрди рдирд╛рдо
- рдЙрдкрдирд╛рдо: рд╕реНрдЯреНрд░рд┐рдВрдЧ - рд╡реИрдХрд▓реНрдкрд┐рдХ рдкрддрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрдВрдкрдиреА DTM рдХреЛ рдЕрдкрдиреА рд╕рд╛рдЗрдЯ crm.company1.dev рд╕реЗ рдмрд╛рдВрдзрдирд╛ рдЪрд╛рд╣рддреА рд╣реИ)
- рд╕рдХреНрд░рд┐рдп: рдмреВрд▓рд┐рдпрди - DTM рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
- рдирд╛рдо: рд╕реНрдЯреНрд░рд┐рдВрдЧ - рдХрдВрдкрдиреА рдХрд╛ рдирд╛рдо
рдмреНрд░рд╛рдВрдб
- рдирд╛рдо: рд╕реНрдЯреНрд░рд┐рдВрдЧ - рдмреНрд░рд╛рдВрдб рдирд╛рдо
- db_name: рд╕реНрдЯреНрд░рд┐рдВрдЧ - рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдирд╛рдо
- company_id: рдкреВрд░реНрдгрд╛рдВрдХ - рдХрдВрдкрдиреА рд╕реЗ рд▓рд┐рдВрдХ
рдиреЛрдЯ: рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХреЗрд╡рд▓ рдбреЛрдореЗрди рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмреНрд░рд╛рдВрдб рдореЙрдбрд▓ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ db_name рдлрд╝реАрд▓реНрдб рдХреЛ рдХрдВрдкрдиреА рдореЙрдбрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╕реНрдерд╛рдиреАрдп рд╕рд░реНрд╡рд░ рдкрд░ рдХреЗрд╡рд▓ DBMS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк db_user, db_host, рдЖрджрд┐ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдХрд┐рд╕реА рджрд┐рди рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛рдУрдВ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдХрд╛рдо рдореЗрдВ рдЖ рд╕рдХрддреА рд╣реИред
рдЗрди рдореЙрдбрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдХреЗрд╡рд▓ рдПрдХ рдореЗрдВ рд╣реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЙрддреНрдкрд╛рджрди рдпрд╛ рд╡рд┐рдХрд╛рд╕, рдЖрдкрдХреЗ RIDS_ENV рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ)ред рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП,
рдкреНрд░рддрд┐рд╖реНрдард╛рди_рд╕рдВрдХреНрд░рдордг рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
/models/company.rb
class Company < ActiveRecord::Base establish_connection "production" has_many :brands, dependent: :destroy validates :subdomain, :db_user, :db_host, :db_port, :name, presence: true end
/models/brand.rb
class Brand < ActiveRecord::Base establish_connection "production" belongs_to :company validates :name, :db_name, presence: true end
рдПрдХ рдХреЛрдб рд▓рд┐рдЦрдирд╛
routes.rb
рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдмреНрд░рд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╣рд░ рдЪреАрдЬ рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
MyApp::Application.routes.draw do scope ':brand' do resource :sessions, only: [:new, :create, :destroy]
application.rb
class ApplicationController < ActionController::Base protect_from_forgery before_filter :override_db before_filter :authenticate_user! def not_found raise ActionController::RoutingError.new('Not Found') end
рдПрдХ рдирдП рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ ActiveRecord рдХреИрд╢ (ActiveRecord :: Base.clear_cache! рдпрд╛ ActiveRecord :: Base.connection_pool.clear_reloadable_connections!) рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
Redefine_uploaders_store_dir рд╡рд┐рдзрд┐ рдЙрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреИрд░рд┐рдпрд░рд╡реЗ рдлрд╛рдЗрд▓реЗрдВ рд╕рдВрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗред рдЖрдк рдпрд╣ рд╣реИрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рд╕рдВрдШрд░реНрд╖ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрд╣реБрдд рдХрдо рд╣реИ (рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ рдореЙрдбрд▓ рдЖрдИрдбреА рдХреЛ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП), рд▓реЗрдХрд┐рди рдпрд╣ рдореМрдЬреВрдж рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЦреЗрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдПрдХ рдФрд░ рддрд┐рдкрд╣рд┐рдпрд╛ рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛
рд╡рд┐рдиреНрдпрд╛рд╕ / рд╡рд╛рддрд╛рд╡рд░рдг / production.rb рдореЗрдВ рдЖрдкрдХреЛ рдХреНрд▓рд╛рд╕ рдХреИрд╢рд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
config.cache_classes = false
рд╣рд╛рдВ, рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдЖ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдЕрдзрд┐рд╡реЗрд╢рди
рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рд╕рддреНрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреБрдХреАрдЬрд╝ рдореЗрдВ рдирд╣реАрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдмреНрд░рд╛рдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдлрд╝реЙрд░реНрдо рд╣реИрдВ рдФрд░ рдореИрдВ рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХреГрдд рд╣реИрдВ рдФрд░ рдПрдХ рдмрдЯрди рдХреЗ рдХреНрд▓рд┐рдХ рдХреЗ рд╕рд╛рде рдкреНрд░рд╡реЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрднреА рднреА рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рддреНрд░реЛрдВ рдХреЛ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдХрдИ рдкрд░ рдирд╣реАрдВ рдлреИрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкрд╣рд▓реЗ рд╣рдо рд╕рддреНрд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ActiveRecord рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрд▓ рдмрддрд╛рддреЗ рд╣реИрдВ:
rails g session_migration rake db:migrate
config / initializers / session_store.rb
MyApp::Application.config.session_store :active_record_store
рдФрд░ рдлрд┐рд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ:
config / environment.rb
рдзреНрдпрд╛рди рджреЗрдВ: рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░реВрдБрдЧрд╛ рдХрд┐ "рдЙрддреНрдкрд╛рджрди" рдпрд╣рд╛рдБ рдФрд░ рдореЙрдбрд▓ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди config / database.yml рдореЗрдВ рдЕрдиреБрднрд╛рдЧ рдирд╛рдо рд╣реИред
рдкреНрд░рд╡рд╛рд╕
рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрди рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
lib / рдХрд╛рд░реНрдп / рдорд▓реНрдЯреАрдордЧреЗрдЯ.рдЯреНрд░реИрдХ
namespace :db do desc "Migrations for all databases" task :multimigrate => :environment do Company.all.each do |company| company.brands.each do |brand| puts "Run migration for #{company.name} (#{brand.name})" sh "cd #{Rails.root.to_s} && bundle exec rake db:migrate RAILS_ENV=#{brand.db_name}" end end end end
рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдбреЗрдЯрд╛рдмреЗрд╕ database.yml рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЦреБрдж рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдирд┐рдпрдо рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛ рдХрд┐ database.yml рдореЗрдВ рд╡рд┐рднрд╛рдЬрди (рдкрд░реНрдпрд╛рд╡рд░рдг) рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рддрд░рд╣ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдм рдЬрдм рдореИрдВ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рдПрдХ рдирдИ рдХрдВрдкрдиреА рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рддреЛ рдХрдВрдЯреНрд░реЛрд▓рд░ database.yml рдореЗрдВ рдПрдХ рдирдпрд╛ рдЦрдВрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕ рдореЙрдбрд▓ рдХреЛ рднреА рдирд┐рд░реНрджреЗрд╢ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ (рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХреЛрд╖реЗрд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ)ред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
class Brand < ActiveRecord::Base establish_connection "production" belongs_to :company after_save :sync_to_yml validates :name, :db_name, presence: true private def sync_to_yml db_config = YAML.load_file(Rails.root.to_s + '/config/database.yml') db_config[self.db_name] = { 'adapter' => 'postgresql', 'encoding' => 'unicode', 'database' => self.db_name, 'pool' => 5, 'username' => self.company.db_user, 'password' => self.company.db_password.present? ? self.company.db_password : nil } if self.company.db_host != 'localhost' db_config[self.db_name].merge( { 'host' => self.company.db_host, 'port' => self.company.db_port } ) end File.open( Rails.root.to_s + '/config/database.yml', 'w' ) do |out| YAML.dump( db_config, out ) end end end
рдЪреЗрддрд╛рд╡рдиреА! рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдмрд╕ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдЕрднреА рднреА after_destroy рдкрд░ рдХреЙрд▓рдмреИрдХ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рд╕рдм рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдХрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рд░реЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдореИрдВ рдЙрди рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рдирд┐рд░реНрдгрдп рдореЗрдВ рдорджрдж рдХреА, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдереЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ (рдПрдХ рд╢рдмреНрдж рдореЗрдВ, рдЖрд▓рд╕реНрдп) рдЦреЛрдЬрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ
рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рддрд╕реНрд╡реАрд░ рдХреЛ рдПрдХ рд╕реНрд░реЛрдд рджреЗ рд╕рдХрддрд╛ рд╣реВрдВред