簡體   English   中英

在gem中使用schema.rb

[英]Use schema.rb in gem

我想rake db:schema:load使用db/schema.rb ,它不在我的應用程序中,而是在我的一個寶石中。 通過在我的application.rb放置config.paths['db/seeds'] = Core::Engine.paths['db/seeds'].existent這已經適用於db:seed (Core是一個寶石,也是一個Rails引擎)。

但是, config.pathsconfig.paths['db'] = Core::Engine.paths['db'].existent沒有db/schema.rb路徑config.paths['db'] = Core::Engine.paths['db'].existent無效。

完成這項工作的最簡單方法是什么?

對於任何偶然發現這一點的人,從Rails 4.0開始,您可以在引擎配置中設置“db”鍵,主應用程序將在那里查找您的架構。

active_record / railties / databases.rake

module MyEngine
  class Engine < ::Rails::Engine
    initializer :override_db_dir do |app|
      app.config.paths["db"] = config.paths['db'].expanded
    end
  end
end

根據Rails 3.2源代碼https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/railties/databases.rake#L400 ,設置SCHEMA env變量應該有所幫助:

ENV['SCHEMA'] = Core::Engine.paths['db'].existent

我記得,Rails 4中的數據庫任務已經發生了重大變化,因此這種方法在Rails 4中不一定有效。

另一種選擇是覆蓋gem中的rake任務本身。

您可以從gem-rake gem_name:install:migrations進行遷移

你為什么不使用自定義rake任務?

desc 'Load a custom.rb file into the database'
  task :load_default_schema do
    file = ENV['SCHEMA'] || "path_to_your_file"
    if File.exists?(file)
      load(file)
    else
      abort %{#{file} doesn't exist yet.}
    end
  end

雖然不完全相同,但您可以執行以下操作,以便在gem中進行遷移,就像它們是應用程序的一部分一樣。 我發現這是一個更優雅的解決方案,而不是嘗試共享架構。 我希望這有幫助。

Rails引擎中的遷移?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM