【问题标题】:Create a Gem for Models to be shared between two applications为模型创建一个 Gem 以在两个应用程序之间共享
【发布时间】:2014-01-23 10:36:57
【问题描述】:

我以前从未这样做过,不知道从哪里开始。我有两个应用程序,一个读,另一个读/写。有人建议我可以在两个应用程序之间共享同一个数据库,并且我应该从读/写应用程序中创建一个我的模型 gem,以便在我的只读应用程序中使用。

这听起来像是一个很好的解决方案,因为这意味着我不必在两个应用程序之间复制我的代码。从哪里开始呢?如果可能的话,我真的很感激解释和一些关于在这里做什么的指导,几乎是一个迷你的操作指南,或者至少在某个地方看?

所以在阅读了更多内容后,我可以看到您可以使用 Bundler 来创建 gem

bundle gem name-of-my-gem

我可以像这样使用 gem,把它放在每个应用程序中

gem "name-of-my-gem", path: "path/to/gem/dir"

我如何真正告诉它我想将哪些模型放入 gem 中?

【问题讨论】:

  • 我不明白为什么将模型外壳放入 gem 中?
  • 所以我不必在每个应用程序中创建所有模型,如果这是一个不好的做法,那么请建议你的方法,但是我希望看到这一点并使用模型创建 gem,如果不是只是为了学习一些东西:)
  • 您已将模型存储在 gem 中,对吗?你必须改变它的代码?如果是的话,你为什么说放入gem,因为我想到了一个数据。
  • 我的看法是每个模型的所有关联和方法都捆绑到一个 gem 中?然后我可以通过 gem 访问这些吗?这是正确的吗?
  • 通常 gem 只是代码,在某些情况下是非数据库数据。我在项目中使用gem没有障碍,因为项目的头是控制数据库数据,而不是gem的。

标签: ruby ruby-on-rails-3 rubygems bundler


【解决方案1】:

如何构建 gem 几乎取决于您,但我会从这里开始:

name-of-my-gem/
.. lib/
.... name-of-my-gem.rb
.... models/
...... all_of_your_models 

您的模型 gem 应该有一个 .rb 文件,可以加载存储在其中的任何模型。如果此文件以 gem 命名并放置在 gem 的 lib/ 目录中,则它应该由 bundler 自动加载。该文件可能如下所示:

require "models/customer"
require "models/order"
# ...

您还可以在这里做一些更有趣的事情,例如获取模型目录中的文件列表并加载每个文件,这样您就不必将每个新模型添加到该文件中。由你决定。

每个 models/ 文件看起来都与您的 rails 应用程序中的模型完全相同:

class Customer < ActiveRecord::Base
  has_many :orders
  # ...
end

您可以从它们当前所在的 rails 应用程序中的 app/models/ 中复制您想要共享的任何模型类,然后将它们粘贴到 gem 中的 models/ 中。然后,您只需更新每个应用程序中的 gem(在每个应用程序中运行 bundle update name-of-my-gem),您应该能够将模型从 app/models/ 中取出,它应该仍然可以工作,因为它将从您的 gem 加载。

这种方法的一个缺点是 Rails 无法在您进行更改后重新加载模型。更改 gem 中的模型后,您需要运行 bundle update name-of-my-gem,然后重新启动 rails 服务器。我建议首先在一个应用程序中充实模型的大部分功能,以利用 rails 代码重新加载,然后在其相当稳定时将其移入 gem。

您也可以赋予您的 gem 代码重新加载功能,但这会变得相当复杂,而我从未这样做过。

【讨论】:

  • 非常感谢,这是有道理的,所以我真的复制了我的模型并将它们放入 gem 中(一旦它们完成就可以了)......可能是一个愚蠢的问题,但来自我在哪里创建宝石?在应用程序之外还是在我的读/写(app1)中?顺便说一句,你帮了大忙
  • 您在应用程序之外创建 gem。本质上,您的模型成为它们自己的库。我当然会建议将您的 gem 保存在 git 存储库中。然后,您可以将每个应用程序的 Gemfile 指向 git repo 而不是 gem 的本地路径:gem "name-of-my-gem", git: "git@somewhere.com:user/repo.git"
  • 说得很有道理......你刚刚为我清理了很多关于创建宝石的东西,如果我能给你更多积分,我会......非常感谢
  • @Richlewis 很高兴我能帮上忙 :-)
  • 最后一个问题,如果我为此在本地创建一个新目录,是否需要 gemfile 任何其他 gem?还是我只是像您在答案中那样设置文件结构?完成后将其推送到仓库?
猜你喜欢
  • 2013-10-31
  • 1970-01-01
  • 2015-05-13
  • 2019-10-12
  • 2018-04-19
  • 2016-06-15
  • 2013-07-16
  • 2010-11-17
  • 2011-12-15
相关资源
最近更新 更多