【发布时间】:2014-12-22 15:57:03
【问题描述】:
我有一个问题一直在尝试解决。我有 4 个不同的 Rails 应用程序使用相同的数据库,这意味着它们需要使用相同的模型并进行相同的迁移。我最初通过创建一个打包到 gem 中的 Rails 引擎来解决这个问题,然后它会携带所有模型和迁移。现在我意识到只有一个应用程序需要某些功能,而其他应用程序不需要——例如管理应用程序需要为所有模型提供可排序表的方法——其他应用程序根本不需要这个功能。
所以我的想法是找到一种方法,让我可以从 gem 中提供“基础”模型,同时在我的特定应用程序中扩充这些基础模型,以便在需要时添加额外的功能。我首先尝试的是继承:
class User < Base::User
end
但这不起作用,因为现在您的加载路径中有 2 个用户模型(User 和 Base::User),并且在查询关联时,它总是为关联的记录类选择“最接近”的类 - 这意味着当您有一个属于_to :user 的Model::Account,它将选择Model::User 作为关联类,而不是User。我尝试反转 AR 类型的计算方法,但这只会导致更多问题。
从技术上讲,我可以从基本引擎 (gem) 提供我的所有模型,但这里的问题是如何在我的应用程序中扩展这些模型? .class_eval 感觉真的很脏,继承不起作用,提供基本功能作为混合意味着“基本”模型根本不像模型。我的目标是尽可能减少其他开发人员的摩擦,我希望他们能够像往常一样在 gem 中定义他们的模型,然后还可以轻松地在其他应用程序中扩展该功能。
之前有没有人解决过这个问题或者有什么建议?或者你们如何在更大的应用程序中解决这个问题?任何帮助将不胜感激。
【问题讨论】:
-
您是否考虑过将应用程序的数据层封装在 Rails API 中,供 4 个客户端应用程序使用?
-
是的,我绝对不想这样做。直接使用 AR 模型(并直接连接到数据库)比将所有内容都公开为 API 更快、更容易。我需要在很多模型上超越基本的 CRUD 功能,并且在我看来,构建这个加上使用它的开销是不值得的。 SOA 不是万能的:)
-
这真的是一件稀罕事,没人在做吗……?
标签: ruby-on-rails rails-activerecord