为什么需要显式加载可安装引擎的迁移和种子?

时间:2014-01-09 23:38:08

标签: ruby-on-rails ruby rake rails-migrations rails-engines

所以我一直在阅读Ruby on Rails Engine guide migrations + seeds 并且似乎为了在引擎上运行种子,它们需要使用它添加到应用程序中

(使用虚拟应用程序的示例)

MyEngine::Engine.load_seed添加到Engine/test/dummy/db/seeds.rb

我的问题是为什么我们需要这样做,他们应该与主应用程序隔离? (它们没有关联,只是为引擎数据库播种)

NB: 如果您正在使用更多上下文,我已将设计gem(/ engine)添加到我的Engine中,种子数据只是在我的Engine上下文中创建用户以登录其界面

1 个答案:

答案 0 :(得分:8)

共享引擎的种子数据和模式有两个部分:模式迁移和种子数据本身。

作为引擎,有两种方法可以在引擎中封装数据库迁移,但让它们在Rails应用程序中正确运行:

  • 将迁移文件物理复制到Rails db/migrate目录
  • Patch Rails迁移加载路径以添加引擎迁移目录:

    config.paths [“db / migrate”] + = config.paths [“db / migrate”] .extended

...在初始化程序中

您可以在此处找到有关引擎内迁移的详细讨论:https://blog.pivotal.io/labs/labs/leave-your-migrations-in-your-rails-engines

分享种子数据有点不太优雅。数据库种子数据是从单个db/seeds.rb文件加载的,因此通过引擎代码包含自定义种子数据需要从种子文件中挂入引擎代码,例如上面的代码:

MyEngine::Engine.load_seed

没有任何黑客或更简单的方法可以做到这一点。您可以在引擎安装/设置任务中自动将该代码预先添加/附加到db/seeds.rb