English 中文(简体)
两个Rails应用共用一个模型文件夹
原标题:
  • 时间:2009-03-18 21:47:59
  •  标签:

我有两个Rail应用程序在同一个数据库上运行,一个运行客户端,另一个提供管理员界面。

这两个应用程序定义的模型基本相同,只有少量区别。让我在两个应用程序中复制大部分模型更改是很繁琐的。

两个应用程序使用相同的模型信息的一种方法是将一个应用程序中的模型文件夹链接到另一个应用程序中,但是由于代码中的一些差异(例如客户端上的额外验证),我无法这样做。

有没有简单的方法可以将差异移出,以便我可以将通用代码放在一处?

问题回答

为什么不采用面向对象的方法,例如创建一个单独的基类(在单独的目录中),然后在两个项目中进行继承,这样差异就在继承的类中。

因此,您有什么要问的吗?

class BaseModel < ActiveRecord::Base

在“common”子目录中,然后您有

class AdminBaseModel < Common::BaseModel

在管理项目中

class UserBaseModel < Common::BaseModel

你可能需要

set_table_name "basemodel"

所以Rails知道要打开哪个表格。

svn:externals或git子模块绝对是解决这种情况的方法。

当然,您希望能够在两个应用程序中进行测试,因此您应该共享您的模型测试或规范。但请记住,模型通常依赖于插件,因此您也需要共享您的插件文件夹。您可能还希望使用相同的宝石和相同版本的Rails,因此最好共享所有供应商。哦,有时您在lib中的代码会修改您的模型,因此您需要共享它。哦,并确保共享环境文件中的任何自定义配置。

你需要设置一个持续集成服务器来运行你的测试套件,以防万一你的主应用程序中的模型层发生更改会影响到你的其他应用程序。

But I mean, once all that is worked out, svn:externals或git子模块绝对是解决这种情况的方法。

更新(几年后)

Rails引擎可能是当前可靠地在多个应用程序之间共享模型代码的最佳选择。它们可以成为宝石并包含在每个应用程序的中。

我在一个类似问题的项目上工作,我们使用 svn:externals 来在两个应用程序之间共享模型代码。

基本上您在一个SVN项目中有模型目录,并在另一个项目中使用外部项目来共享代码。您可以在任一项目中编辑代码,当您在另一个项目中运行svn up时,它将被更新。

就Rails和您的构建脚本而言,这两个models目录是完全独立的。

是的,创建模型目录的符号链接,但是为每个实例在environment.rb中添加环境变量。然后您的模型可以知道哪个实例在使用它并包括额外的验证或其他内容。

在 environment.rb 文件中:

APP_INSTANCE = "app1"

在 model.rb 中

validates_length_of :name, :within => 3..100, :if => :is_app_one?

def is_app_one?
    APP_INSTANCE == "app1"
end

您可以将一个Rails项目视为一个gem,然后通过将其模型路径添加到加载路径中,在其他Rails项目中使用它。

Here s an example, i think you can get it, though it s written in chinese. http://mvj3.github.com/2011/09/13/multiple_rails_apps_sharing_models_folder/

有点好奇 - 为什么不用一个应用有两种模式呢?

我有一个应用程序,看起来像十几个不同的应用程序之一,根据您输入的URL和登录的用户不同,具有不同的品牌和功能。我的用户有角色,我添加了一个方法到ActiveRecord::Base,使您可以获得当前用户。因此,我可以做一些事情:

MAX_VOLUME = current_user.admin? ? 11 : 10
validates_inclusion_of :volume, :in => 0..MAX_VOLUME # Admins can go to 11!

在观点中,像这样的东西:

<%= render :partial => common_tabs %>
<%= render :partial => admin_tabs if @current_user.admin? %>

为什么不使用组合而不是继承?

我有一个类似的问题:有一个管理员应用程序和一个公共应用程序,使用相同的数据库,但是针对某个应用程序的某些模型只有一些特定的方法。

我目前在考虑,我可以创建一个有许多模块的共同空间,我可以在这里放置我的方法。然后,每当我需要它们时,在每个应用程序中(在模型、控制器、助手等中)包含我需要的模块。这个地方可以在lib目录中(使用Git子模块或SVM外部更新),或者在gem中(使用Bundler或类似的工具更新)。

你对此有何看法?





相关问题
热门标签