मेरे सभी साझा मॉडल को एक इंजन में स्थानांतरित करने की तलाश है जिसे मेरे प्रत्येक माइक्रो ऐप्स में शामिल किया जा सकता है।रेल इंजन या ऐप में एकाधिक स्कीमा कैसे लोड करें?
इस इंजन, हमारे सभी विरासत डेटा के लिए एक मॉडल परत प्रदान करना चाहिए जिनमें शामिल हैं:
- मॉडल फ़ाइलें
- स्कीमा फ़ाइलों
- माइग्रेशन (हम 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
के लिए प्रभावित करने की कोशिश कर रहा हूं?
मैं एक इंजन एक बार मॉडलों के साथ काम किया कहते हैं। हमने केवल मॉडल और माइग्रेशन साझा किए और यह ठीक काम किया। 'स्कीमा।आरबी 'हम प्रत्येक ऐप के लिए व्यक्तिगत रूप से रखा; इंजन ने कोई भी प्रदान नहीं किया। यह समझ में आता है क्योंकि डेटाबेस एक ऐप से संबंधित है, इंजन के लिए नहीं। एचटीएच – Raffael
थैक्स राफेल! ज्यादातर मामलों में, आप बिल्कुल सही होते हैं: इंजन नया मॉडल कोड जोड़ता है, या मौजूदा मॉडलों को बढ़ाता है, और यह ऐप में schema.rb लाइव रहने देता है। हमारे मामले में, हालांकि, इंजन उन मॉडलों का प्रतिनिधित्व करता है जो पूरी तरह से अलग डेटाबेस में रहते हैं - इसलिए हमें इन मॉडलों के लिए एक अलग स्कीमा फ़ाइल की आवश्यकता है (दाएं?) –
मैं देखता हूं। मैंने कभी भी कई डेटाबेस के साथ काम नहीं किया, हालांकि मैं हमेशा ऐसा करने के लिए उत्सुक था। स्पष्ट रूप से आप प्रति-मॉडल-वर्ग आधार पर विभिन्न डेटाबेस का उपयोग कर सकते हैं। अगर आपको अतिरिक्त डेटाबेस पर माइग्रेशन चलाने की ज़रूरत है तो यह थोड़ा सा चालक हो जाता है; http://excid3.com/blog/rails-activerecord-multiple- डेटाबेस-and-migrations/ – Raffael