在两个Rails应用程序之间共享通用模型

时间:2014-09-23 10:48:25

标签: ruby-on-rails

我正在开发一个电子商务应用程序,并在其管理网站上工作。这两个应用程序具有相同的业务域,并且在管理应用程序中需要一些来自电子商务应用程序的模型。

我在网上找到了一些共享模型的解决方案,虽然我不清楚哪个更好,我应该如何实现它。

我发现的解决方案:

  1. Create a rake task to copy the models from the e-commerce app to the admin app

  2. Create a third ruby module and put the models in there and pull the models from the app directory into this newly created lib and require it inside the app

  3. 自动将模型从电子商务应用加载到管理红宝石搜索

    config.autoload_paths += %W(#{config.root}/../e-commerce-app/app/models/)
    
  4. 我认为第二种解决方案是正确的方法,但我不确定如何实现它。

3 个答案:

答案 0 :(得分:9)

这些都没有。

如何创建共享gem并将其放在私有git repo上。使用Rails,您可以通过将gem打包为rails_engine来提供与应用程序本身内自动加载模型相同的机制

请参阅example

最后在Gemfile中需要它

gem 'my_gem_name', git: 'http:my_git_repo.com/my_gem_name'

更先进的解决方案是为电子商务应用中的所需数据创建REST服务,并在管理应用中使用它。特别是对于用户(和身份验证),它甚至可以将其提取到单独的应用程序并提供UserAuthentication服务。

答案 1 :(得分:2)

最简单的方法是使用命令行创建一个'Mountable'gem:

rails plugin new e_commerce_app_core --mountable

这将设置您的rails引擎,因此您只需将模型从应用移至e_commerce_app_core/app/models/

我像这样包含宝石:

gem 'e_commerce_app_core_core', git: 'https://github.com/my_repo/e_commerce_app_core_core.git'

然后我跑:

bundle config local.e_commerce_app_core_core ../e_commerce_app_core_core

此命令将本地目录附加到您的构建而不是使用外部存储库。这样我可以在本地处理gem,并在我准备好时将其推送到github。

我还移动了包含登录逻辑的用户控制器,但为了让我的用户路由正常工作我改变了我的config/routes.rb

ECommerceAppCore::Engine.routes.draw do
  ...
end

为:

Rails.application.routes.draw do
  ...
end

我将迁移添加到我的application.rb

,将我的迁移移至我的宝石
config.paths['db/migrate'] = ECommerceAppCore::Engine.paths['db/migrate'].existent

答案 2 :(得分:1)

您可以使用Git-subtree。

Git Subtree用于在rails应用程序之间共享代码

请查看 - http://igor-alexandrov.github.io/blog/2013/03/28/using-git-subtree-to-share-code-between-rails-applications/

我认为这会对你有帮助。