2009-12-28 17 views
15

Farklı istemciler için PostgreSQL şemaları kullanarak çok kiracılı raylar üzerinde çalışıyorum. Raylar geçişleri, kutudan çok sayıda şema ile çalışmaz, bu nedenle tüm şemaları taşımak için aşağıdaki komisyon görevini yaptım ve işe yaramış gibi görünüyor. Benim sorum başkalarının daha iyi ve daha zarif çözümler uygulamış olmasıdır. Çok sayıda şema kullanarak PostgreSQL için ray kod örnekleri de dahil olmak üzere iyi bir öğretici ile gerçekten mutlu olurdum. Bugüne kadar yalnızca konu http://aac2009.confreaks.com/06-feb-2009-14-30-writing-multi-tenant-applications-in-rails-guy-naor.html üzerinde iyi bir sunum ve ben tomayko.com/writings/rails-multiple-connections için amaçlayan ediyorum ne bir örnek bulduk aldığım takdirdePostgreSQL şemaları için geçişler için raylar

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 
+0

Liquibase, bildiğim kadarıyla şemalarla çalışır. – Janning

+1

@Janning Liquibase, rayların kullandığı ActiveRecord modle çalışan bir çözüm değildir. – lillq

cevap

0

emin değilim Doğru soru, ancak her birinizde farklı "veritabanı" ile database.yml içinde birkaç ortam daha bildirmeniz gerekmiyor mu?

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 

Sonra ben tırmık aramaya devam edebilir, normal olarak göçler kullanın::

+2

Posta zarflarındaki şemalar bir veri tabanı içerisindedir. I.E bir veritabanı birçok şemaya sahip olabilir. – lillq

8

kullandığım ve taşıma taşıma işlemlerine ilişkin aşağıdaki yöntemi olan bir schema_utils kütüphane var senin göçlerde, Şimdi Taşınacak kullanabilirsiniz:

... 
schemas.each do |schema| 
    SchemaUtils.with_schema(schema) do 
    #Put migration code here 
    #e.g. add_column :xyz, ... 
    end 
end 

ben aşağıdakileri yapın kodlarını hesap şemaları haritalama olma eğilimindedir Çünkü:

Account.for_each do |account| 
    SchemaUtils.with_schema(account.code) do 
    #Put migration code here 
    end 
end 
0

Bu senaryolardan dolayı, yani birden fazla uygulamanın aynı veritabanını paylaştığı durumlardan dolayı pg_migrate yazdım. Bunu yapmak için bir Rails yolu muhtemelen var mı (motorlar?) Ama ben de sık sık veritabanına ihtiyacı olan Rails olmayan başka bir uygulama var. O zaman ne?

Bu durumda, pg_migrate anahtar özelliği bir yakut taşı üretebildiği; Bu nedenle veritabanı şemanızı tüm alt uygulamalardan ayrı olarak korumak mümkün olur, ancak hepsi bunu referans alabilir. Eğer pg_migrate en 'paketin' komutunu kullanarak yakut mücevher inşa ettik sonra Raylar Gemfile yılında

, bunu yapabilirsiniz:

gem 'my_db', gem 'jam_db', :path=> "../my_db/gem_package" 
0

Kontrol sadece bu amaç için inşa edildi apartment mücevher. Bu dahice.

İlgili konular