Tìm cách di chuyển tất cả các mô hình được chia sẻ của tôi sang một công cụ có thể được bao gồm trong mỗi ứng dụng vi mô của tôi.Làm thế nào để tải nhiều lược đồ vào một công cụ hoặc ứng dụng Rails?
Động cơ này nên cung cấp một lớp mô hình cho tất cả các dữ liệu di sản của chúng tôi, bao gồm:
- file mẫu file
- Schema
- Migrations (chúng tôi đang theo Pivotal Labs' pattern, đây không phải là vấn đề)
Tệp mô hình đang được tự động vá, điều đó vẫn ổn.
file Schema đang được khỉ vá trong việc sử dụng 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
Chúng ta cần rake db:create
và rake db:schema:load
để làm việc,
Các db.rake
bản vá lỗi chỉ ảnh hưởng đến db:schema:dump
và db:test:load_schema
(một phần của tests_prepare, tôi giả sử) . Tôi đã cố gắng vá chúng vào db:schema:load
sử dụng:
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
Nhưng điều này mang lại cho tôi những lỗi NoMethodError: undefined method 'recreate_database' for #<ActiveRecord::ConnectionAdapters::SQLite3Adapter:0x007feb6bb43558>
. Rõ ràng, điều này chỉ hoạt động trên cơ sở dữ liệu kiểu Oracle?
Lệnh Rails cho các số DROP
và CREATE DATABASE
sql cơ bản là gì? Tôi đang cố gắng ảnh hưởng đến số lượng thêm schema.rb
?
tôi làm việc với một động cơ có chứa mô hình một lần. Chúng tôi chỉ chia sẻ các mô hình và di chuyển và hoạt động tốt. Sơ đồ '.rb' chúng tôi giữ riêng cho từng ứng dụng; động cơ không được cung cấp. Điều này làm cho cảm giác imho kể từ khi cơ sở dữ liệu thuộc về một ứng dụng, không phải cho một động cơ. HTH – Raffael
Thx Raffael! Trong hầu hết các trường hợp, bạn hoàn toàn chính xác: Công cụ thêm mã mô hình mới hoặc mở rộng các mô hình hiện tại và có ý nghĩa để cho schema.rb hoạt động trong ứng dụng. Tuy nhiên, trong trường hợp của chúng ta, động cơ đại diện cho các mô hình sống trong một cơ sở dữ liệu hoàn toàn khác - vì vậy chúng ta cần có một tệp lược đồ khác cho các mô hình này (phải không?) –
Tôi hiểu. Tôi chưa bao giờ làm việc với nhiều cơ sở dữ liệu, mặc dù tôi luôn tò mò như thế nào để làm điều này. Rõ ràng bạn có thể sử dụng các cơ sở dữ liệu khác nhau trên cơ sở từng mô hình. Nó nhận được một chút trickyer nếu bạn cần phải chạy di trú trên cơ sở dữ liệu bổ sung, quá; xem http://excid3.com/blog/rails-activerecord-multiple-databases-and-migrations/ – Raffael