複数のRailsアプリケーションが同じバックエンドと通信しているので、いくつかの移行を共有してほしい。
私はRailsエンジン(enginexを使用))をセットアップしましたが、何も(コントローラー、ビュー、モデルなど)共有できますが、移行はできません。動作させることはできません。 !
私はファイルdb/migrate/my_migration.rbを作成しようとしましたが、メインアプリケーションで作成した場合:
rake db:migrate
それらはロードされません。
いくつかグーグルした後、これにいくつかの 最近の作業 があり、 this がRailsマスターにマージされたようです。私はRails 3.0.3これを機能させる方法はありますか?
よろしくお願いします!
私がすることは、マイグレーションをRailsサイト自体に追加するInstallGenerator
を追加することです。これは、あなたが言及したものとまったく同じ動作ではありませんが、今のところ、私にとっては、それで十分です。
小さなハウツー:
まず、フォルダーlib\generators\<your-gem-name>\install
を作成し、そのフォルダー内にinstall_generator.rb
というファイルを作成します。次のコードを使用します。
require 'Rails/generators/migration'
module YourGemName
module Generators
class InstallGenerator < ::Rails::Generators::Base
include Rails::Generators::Migration
source_root File.expand_path('../templates', __FILE__)
desc "add the migrations"
def self.next_migration_number(path)
unless @prev_migration_nr
@prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
else
@prev_migration_nr += 1
end
@prev_migration_nr.to_s
end
def copy_migrations
migration_template "create_something.rb", "db/migrate/create_something.rb"
migration_template "create_something_else.rb", "db/migrate/create_something_else.rb"
end
end
end
end
lib/generators/<your-gem-name>/install/templates
内に、マイグレーションを含む2つのファイルを追加します。 create_something.rb
という名前のものを使用します。
class CreateAbilities < ActiveRecord::Migration
def self.up
create_table :abilities do |t|
t.string :name
t.string :description
t.boolean :needs_extent
t.timestamps
end
end
def self.down
drop_table :abilities
end
end
次に、あなたの宝石がいくつかのアプリに追加されたら、あなたはただすることができます
Rails g <your_gem_name>:install
これで移行が追加され、rake db:migrate
を実行できます。
お役に立てれば。
Rails 3.1では、このコマンドを使用して、エンジン名がexample
であるとすると、次のようになります。
# Note that you append _engine to the name
rake example_engine:install:migrations
3.1では、config/application.rbを次のように変更して、移行をインストールせずに共有できます。
# Our migrations live exclusively w/in the Commons project
config.paths['db/migrate'] = Commons::Engine.paths['db/migrate'].existent
Rails 3.1の時点では、解決策は次のようになります:
bundle exec rake railties:install:migrations
特定のRailtieからのみコピーする場合は、次のようにします。
bundle exec rake railties:install:migrations FROM=foo_engine
名前は、gemの名前がplus _engineであることに注意してください。したがって、gemが「foo」の場合、名前はfoo_engineです。
Rails 4の場合:
initializer :append_migrations do |app|
unless app.root.to_s.match root.to_s
config.paths["db/migrate"].expanded.each do |expanded_path|
app.config.paths["db/migrate"] << expanded_path
end
end
end
https://content.pivotal.io/blog/leave-your-migrations-in-your-Rails-engines
Leviの答えから抜け出すために、アプリケーションの代わりに、実際のエンジンのエンジンファイルで次のようなことを行うこともできます。
したがって、lib/commons/engine.rb
module Commons
class Engine < Rails::Engine
initializer "commons.load_app_instance_data" do |app|
Commons.setup do |config|
config.app_root = app.root
end
app.class.configure do
#Pull in all the migrations from Commons to the application
config.paths['db/migrate'] += Commons::Engine.paths['db/migrate'].existent
end
end
initializer "commons.load_static_assets" do |app|
app.middleware.use ::ActionDispatch::Static, "#{root}/public"
end
end
end
編集:この後、人の移行履歴を台無しにしないように注意してください。変更が必要な場合は、新しい移行を追加してください。そうしないと、誰かに醜いロールバックを強制する可能性があります。