2010-10-08 7 views
14

एक सहयोगी और मैं कुछ मॉडलों को साझा करने वाली विभिन्न परियोजनाओं में काम कर रहा हूं। इसलिए, हम एक गिट सबमिशन के माध्यम से मॉडल साझा कर रहे हैं।एक अतिरिक्त/अलग माइग्रेशन फ़ोल्डर को कॉन्फ़िगर कैसे करें

इसके अतिरिक्त, हम भी माइग्रेशन साझा करने के लिए सक्षम होने के लिए करना चाहते हैं:

इस तरह, अपने साथी के माइग्रेशन अपने प्रोजेक्ट के फ़ोल्डर db/migrate/other_db में होगा।

मैं रेल माइग्रेशन भी इस अतिरिक्त फ़ोल्डर में माइग्रेशन चलाने के लिए कॉन्फ़िगर कर सकते हैं?

उत्तर

26
सभी वातावरण या config/वातावरण के लिए

अपने कॉन्फ़िग फ़ाइल में (config/application.rb/$ (पर्यावरण) .rb केवल विशेष वातावरण के लिए) इस पंक्ति जोड़ें:

config.paths['db/migrate'] += 'db/migrate/other_db' 

और तुम (config.paths [ 'db/विस्थापित'] डिफ़ॉल्ट को बदलना चाहते हैं 'db/विस्थापित' पथ के साथ एक सरणी है डिफ़ॉल्ट रूप से एक स्ट्रिंग 'डीबी/माइग्रेट'), यह करें:

config.paths['db/migrate'] = ['db/my_migrate'] 

यहाँ डिफ़ॉल्ट config.paths है, जो हम भी बदल सकता है:

"app" => ["app"], 
"app/assets" => ["app/assets"], 
"app/controllers" => ["app/controllers"], 
"app/helpers" => ["app/helpers"], 
"app/models" => ["app/models"], 
"app/mailers" => ["app/mailers"], 
"app/views" => ["app/views"], 
"lib" => ["lib"], 
"lib/assets" => ["lib/assets"], 
"lib/tasks" => ["lib/tasks"], 
"config" => ["config"], 
"config/environments" => ["config/environments"], 
"config/initializers" => ["config/initializers"], 
"config/locales" => ["config/locales"], 
"config/routes" => ["config/routes.rb"], 
"db" => ["db"], 
"db/migrate" => ["db/migrate"], 
"db/seeds" => ["db/seeds.rb"], 
"vendor" => ["vendor"], 
"vendor/assets" => ["vendor/assets"], 
"vendor/plugins" => ["vendor/plugins"], 
"config/database" => ["config/database.yml"], 
"config/environment" => ["config/environment.rb"], 
"lib/templates" => ["lib/templates"], 
"log" => ["log/development.log"], 
"public" => ["public"], 
"public/javascripts" => ["public/javascripts"], 
"public/stylesheets" => ["public/stylesheets"], 
"tmp" => ["tmp"], 
+3

रेल 4 में: 'config.paths [ 'db/विस्थापित'] << 'db/विस्थापित/other_db'' – Kris

+7

सही उत्तर 'config.paths [' db/migrate '] <<' db/migrate/other_db'' रेल 3 या 4 के लिए है। – pisaruk

+1

'config.paths [' db/migrate '] + = [' db/migrate/other_db ']' भी काम करेगा। –

2

मैं यह करने के लिए एक बहुत साफ रास्ता है, लेकिन कोड है कि माइग्रेशन चलाता है के बारे में पता नहीं है लग रहा है कि:

@migrations ||= begin                                    
     files = Dir["#{@migrations_path}/[0-9]*_*.rb"]                             

     migrations = files.inject([]) do |klasses, file|                            
      version, name = file.scan(/([0-9]+)_([_a-z0-9]*).rb/).first 

कहाँ,

@migrations_path = 'db/migrate' 

तो अगर आप इसे बदल पढ़ने के लिए इसके बजाय कॉन्फ़िगरेशन फ़ाइल से, यह आपके पक्ष में काम कर सकता है। लेकिन जैसा कि मैंने कहा, यह निश्चित रूप से ऐसा करने का एक बहुत साफ तरीका नहीं है।

3

स्वानंद द्वारा उत्तर के आधार पर, हम एक बाहरी dir में माइग्रेशन लोड करने के लिए एक प्रवास लिख सकते हैं:

class MigrateMetadata < ActiveRecord::Migration 
    MIGRATIONS_PATH='db/migrate/metadata' 
    def self.up 
    Dir["#{MIGRATIONS_PATH}/[0-9]*_*.rb"]. 
    sort.map{|filename|require filename}.flatten. 
    each{|class_name| const_get(class_name).up} 
    end 

    def self.down 
    Dir["#{MIGRATIONS_PATH}/[0-9]*_*.rb"].sort.reverse. 
    map{|filename|require filename}.flatten. 
    each{|class_name| const_get(class_name).down} 
    end 
end 
2

वैसे, अगर आप रेल के साथ काम करने के लिए एक मणि निर्माण कर रहे हैं, तो आप एक ब्लॉक में निम्नलिखित की तरह जगह कर सकते हैं मणि की खुद की माइग्रेशन जोड़ने के लिए आपकी रेल टाई।

root = ... # the path to your gem 
    initializer :append_migrations do |app| 
    unless app.root.to_s.match root 
     app.config.paths["db/migrate"] << File.join(root, 'db/migrate') 
    end 
    end 

यदि आप इस तकनीक का उपयोग करते हैं तो जेनरेटर के साथ अपने मणि से माइग्रेशन कॉपी करने की आवश्यकता नहीं है।

आप इस तरह की कुछ बात के साथ अपने मणि की मूल निर्देशिका उपज के लिए एक विधि कर सकते हैं ...

module MyGemName 
    def root 
    File.expand_path '../..', __FILE__ 
    end 

    module_method :root 
end 

... अपने मणि में फ़ाइल lib/my_gem_name.rb में।

0

बस अपने lib/engine.rb को यह प्रारंभकर्ता जोड़ें:

initializer 'your_engine_name.migrations' do |app| 
    config.paths['db/migrate'].expanded.each do |expanded_path| 
    app.config.paths['db/migrate'] << expanded_path 
    ActiveRecord::Migrator.migrations_paths << expanded_path 

    if Rake.application.top_level_tasks.empty? 
     ActiveRecord::Migration.check_pending! if ActiveRecord::Migrator.needs_migration? 
    end 
    end 

end 
संबंधित मुद्दे