Я работаю над многопользовательским использованием приложения направляющих схемы PostgreSQL для различных клиентов. Миграции направляющих не работают с несколькими схемами из поля, таким образом, я сделал следующую задачу граблей переместить все схемы, и это, кажется, работает. Мой вопрос состоит в том, если другие реализовали лучше и более изящные решения. Я также был бы действительно доволен хорошим учебным руководством включая примеры кода направляющих для PostgreSQL с помощью нескольких схем. До сих пор я только нашел хорошую презентацию на подчиненном http://aac2009.confreaks.com/06-feb-2009-14-30-writing-multi-tenant-applications-in-rails-guy-naor.html и примере того, что я стремлюсь к tomayko.com/writings/rails-multiple-connections
desc 'Migrates all postgres schemas'
task :schemas do
# get all schemas
env = "#{RAILS_ENV}"
config = YAML::load(File.open('config/database.yml'))
ActiveRecord::Base.establish_connection(config[env])
schemas = ActiveRecord::Base.connection.select_values("select * from pg_namespace where nspname != 'information_schema' AND nspname NOT LIKE 'pg%'")
puts "Migrate schemas: #{schemas.inspect}"
# migrate each schema
schemas.each do |schema|
puts "Migrate schema: #{schema}"
config = YAML::load(File.open('config/database.yml'))
config[env]["schema_search_path"] = schema
ActiveRecord::Base.establish_connection(config[env])
ActiveRecord::Base.logger = Logger.new(STDOUT)
ActiveRecord::Migrator.migrate('db/migrate', ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
end
end
Я не уверен, правильно ли я понял вопрос, но разве вам не нужно просто объявить Еще несколько сред в вашем database.yml
с разными «базами данных», указанными в каждой?
У меня есть библиотека schema_utils, которую я использую, и следующий метод обработки миграций:
def self.with_schema(schema_name, &block)
conn = ActiveRecord::Base.connection
old_schema_search_path = conn.schema_search_path
conn.schema_search_path = schema_name
begin
yield
ensure
conn.schema_search_path = old_schema_search_path
end
end
Затем я использую миграции как обычно, поэтому могу продолжать вызывать rake: migrate Теперь в своих миграциях вы можете использовать:
...
schemas.each do |schema|
SchemaUtils.with_schema(schema) do
#Put migration code here
#e.g. add_column :xyz, ...
end
end
Поскольку я обычно сопоставляю схемы с кодами учетных записей, я делаю следующее:
Account.for_each do |account|
SchemaUtils.with_schema(account.code) do
#Put migration code here
end
end