2009-12-28 17 views
15

के लिए रेल माइग्रेशन मैं विभिन्न ग्राहकों के लिए 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 के लिए लक्ष्य कर रहा हूँ का एक उदाहरण पाया हैpostgreSQL स्कीमा

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

लिक्विबेस स्कीमा के साथ काम करता है, जहां तक ​​मुझे पता है कि – Janning

+1

@ जेनिंग लिक्विबेस एक ऐसा समाधान नहीं है जो रेलवे का उपयोग करता है जो ActiveRecord मोडल के साथ काम करता है। – lillq

उत्तर

0

मैं अगर मैं मिल यकीन नहीं है सही सवाल है, लेकिन क्या आपको अपने database.yml में कुछ और वातावरण निर्दिष्ट करने की आवश्यकता नहीं है, जिसमें प्रत्येक में निर्दिष्ट "डेटाबेस" है?

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 

मैं तो सामान्य रूप में माइग्रेशन उपयोग करती हैं इसलिए मैं रेक कॉल करने के लिए जारी रख सकते हैं:

+2

पोस्टग्रेज़ में स्कीमा डेटाबेस के भीतर हैं। आईई एक डेटाबेस में कई स्कीमा हो सकते हैं। – lillq

8

मैं जो मैं का उपयोग और हैंडलिंग माइग्रेशन के लिए निम्न विधि है एक schema_utils पुस्तकालय है आपके माइग्रेशन में अब विस्थापित, आप उपयोग कर सकते हैं:

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

मैंने इन परिदृश्यों के कारण pg_migrate लिखा, यानी, ऐसी परिस्थितियां जिनमें एकाधिक अनुप्रयोग समान डेटाबेस साझा करते हैं। संभवतः इस (इंजन?) को संभालने के लिए एक रेल तरीका है, लेकिन मेरे पास अक्सर एक और ऐप होता है जो रेल नहीं है जिसके लिए डेटाबेस की भी आवश्यकता होती है ... तो क्या?

इस मामले में, pg_migrate की मुख्य विशेषता यह एक रूबी मणि उत्पन्न कर सकती है; इसलिए सभी डाउनस्ट्रीम अनुप्रयोगों से अलग-अलग डेटाबेस स्कीमा को बनाए रखना संभव हो जाता है, लेकिन सभी इसका संदर्भ दे सकते हैं।

अपने रेल Gemfile में, आपके द्वारा pg_migrate की 'पैकेज' आदेश का उपयोग माणिक रत्न का निर्माण किया है, तो आप कर सकते हैं:

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

चेक apartment मणि है कि बस उस उद्देश्य के लिए बनाया गया है। यह शानदार है।