2015-12-22 13 views
9

मेरे सभी साझा मॉडल को एक इंजन में स्थानांतरित करने की तलाश है जिसे मेरे प्रत्येक माइक्रो ऐप्स में शामिल किया जा सकता है।रेल इंजन या ऐप में एकाधिक स्कीमा कैसे लोड करें?

इस इंजन, हमारे सभी विरासत डेटा के लिए एक मॉडल परत प्रदान करना चाहिए जिनमें शामिल हैं:

  • मॉडल फ़ाइलें
  • स्कीमा फ़ाइलों
  • माइग्रेशन (हम Pivotal Labs' pattern बनाए हुए हैं, यह मुद्दा नहीं है)

मॉडल फ़ाइलों को स्वचालित रूप से पैच किया जा रहा है, यह ठीक है।

स्कीमा फ़ाइलों Nikolay Strum's db.rake का उपयोग करने में किया जा रहा बंदर-समझौता कर रहे हैं:

namespace :db do 
    namespace :schema do 
    # desc 'Dump additional database schema' 
    task :dump => [:environment, :load_config] do 
     filename = "#{Rails.root}/db/foo_schema.rb" 
     File.open(filename, 'w:utf-8') do |file| 
     ActiveRecord::Base.establish_connection("foo_#{Rails.env}") 
     ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file) 
     end 
    end 
    end 

    namespace :test do 
    # desc 'Purge and load foo_test schema' 
    task :load_schema do 
     # like db:test:purge 
     abcs = ActiveRecord::Base.configurations 
     ActiveRecord::Base.connection.recreate_database(abcs['foo_test']['database'], mysql_creation_options(abcs['foo_test'])) 
     # like db:test:load_schema 
     ActiveRecord::Base.establish_connection('foo_test') 
     ActiveRecord::Schema.verbose = false 
     load("#{Rails.root}/db/foo_schema.rb") 
    end 
    end 
end 

हम rake db:create और rake db:schema:load जरूरत है काम करने के लिए,

db.rake पैच केवल db:schema:dump और db:test:load_schema को प्रभावित (tests_prepare का हिस्सा है, मुझे लगता है) । मैं का उपयोग कर db:schema:load में उन्हें पैच करने के लिए प्रयास किया है:

namespace :db do 

    # Helpers 
    def mysql_creation_options(config) 
    @charset = ENV['CHARSET'] || 'utf8' 
    @collation = ENV['COLLATION'] || 'utf8_unicode_ci' 
    {:charset => (config['charset'] || @charset), :collation => (config['collation'] || @collation)} 
    end 

    def load_schema(schema_name) 
    abcs = ActiveRecord::Base.configurations 
    ActiveRecord::Base.connection.recreate_database(abcs[schema_name+'_test']['database'], mysql_creation_options(abcs[schema_name+'_test'])) 
    # like db:test:load_schema 
    ActiveRecord::Base.establish_connection(schema_name+'_test') 
    ActiveRecord::Schema.verbose = false 
    load("#{Rails.root}/db/#{schema_name}_schema.rb") 
    end 

    namespace :schema do 
    # desc 'Dump additional database schema' 
    task :dump => [:environment, :load_config] do 
     dump_schema = -> (schema_name) { 
     filename = "#{Rails.root}/db/#{schema_name}_schema.rb" 
     File.open(filename, 'w:utf-8') do |file| 
      ActiveRecord::Base.establish_connection("#{schema_name}_#{Rails.env}") 
      ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file) 
     end 
     } 

     dump_schema.call('kiddom') 
     dump_schema.call('kiddom_warehouse') 
    end 

    # When loading from schema, load these files, too 
    task :load => [:environment, :load_config] do 
     load_schema('kiddom') 
     load_schema('kiddom_warehouse') 
    end 
    end 

    namespace :test do 
    # desc 'Purge and load foo_test schema' 
    task :load_schema do 
     load_schema('kiddom') 
     load_schema('kiddom_warehouse') 
    end 
    end 
end 

लेकिन यह मुझे त्रुटि NoMethodError: undefined method 'recreate_database' for #<ActiveRecord::ConnectionAdapters::SQLite3Adapter:0x007feb6bb43558> देता है। जाहिर है, यह केवल ओरेकल-प्रकार डेटाबेस पर काम करता है?

अंतर्निहित DROP और CREATE DATABASE वर्ग के लिए रेल कमांड क्या हैं मैं अतिरिक्त schema.rb के लिए प्रभावित करने की कोशिश कर रहा हूं?

+0

मैं एक इंजन एक बार मॉडलों के साथ काम किया कहते हैं। हमने केवल मॉडल और माइग्रेशन साझा किए और यह ठीक काम किया। 'स्कीमा।आरबी 'हम प्रत्येक ऐप के लिए व्यक्तिगत रूप से रखा; इंजन ने कोई भी प्रदान नहीं किया। यह समझ में आता है क्योंकि डेटाबेस एक ऐप से संबंधित है, इंजन के लिए नहीं। एचटीएच – Raffael

+0

थैक्स राफेल! ज्यादातर मामलों में, आप बिल्कुल सही होते हैं: इंजन नया मॉडल कोड जोड़ता है, या मौजूदा मॉडलों को बढ़ाता है, और यह ऐप में schema.rb लाइव रहने देता है। हमारे मामले में, हालांकि, इंजन उन मॉडलों का प्रतिनिधित्व करता है जो पूरी तरह से अलग डेटाबेस में रहते हैं - इसलिए हमें इन मॉडलों के लिए एक अलग स्कीमा फ़ाइल की आवश्यकता है (दाएं?) –

+0

मैं देखता हूं। मैंने कभी भी कई डेटाबेस के साथ काम नहीं किया, हालांकि मैं हमेशा ऐसा करने के लिए उत्सुक था। स्पष्ट रूप से आप प्रति-मॉडल-वर्ग आधार पर विभिन्न डेटाबेस का उपयोग कर सकते हैं। अगर आपको अतिरिक्त डेटाबेस पर माइग्रेशन चलाने की ज़रूरत है तो यह थोड़ा सा चालक हो जाता है; http://excid3.com/blog/rails-activerecord-multiple- डेटाबेस-and-migrations/ – Raffael

उत्तर

0

आप SQLite का उपयोग अपने डेटाबेस इंजन के रूप में कर रहे हैं। उम्मीद है कि आप यही करना चाहते हैं।

चूंकि आप SQLite डेटाबेस बना रहे हैं, तो चीजें अन्य डेटाबेस एडेप्टर जैसे MySQLAdpter या Postgress से भिन्न होती हैं।

MySQL के मामले में, डेटाबेस को "डेटाबेस बनाएं ..." एसक्यूएल कमांड खर्च करके कनेक्शन स्थापित करने से पहले बनाया जाना है। इसलिए आपको कनेक्शन स्थापित करने से पहले डेटाबेस बनाना होगा।

लेकिन SQLite के मामले में, डेटाबेस एक फ़ाइल में रहता है और एक फ़ाइल में केवल एक डेटाबेस हो सकता है, डेटाबेस बनाने के लिए कोई अलग कदम नहीं है। डेटाबेस से कनेक्शन स्थापित करने का प्रयास डेटाबेस फ़ाइल को बनाएगा।

इसलिए SQLiteAdapter का उपयोग करते समय create_database विधि काम नहीं करेगा। आप बस उस कोड को अपने कोड से हटा सकते हैं।

आप रैक कार्य डाटाबेस के लिए स्रोत कोड पर एक नज़र हो सकता है: बनाने

https://github.com/rails/rails/blob/f47b4236e089b07cb683ee9b7ff8b06111a0ec10/activerecord/lib/active_record/railties/databases.rake

इसके अलावा, SQLiteDatabaseTasks में 'बनाएं' विधि के लिए स्रोत कोड। आप देख सकते हैं, यह बस establish_connection विधि

https://github.com/rails/rails/blob/f47b4236e089b07cb683ee9b7ff8b06111a0ec10/activerecord/lib/active_record/railties/databases.rake

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