Rails 3.1引擎和数据库

4
Rails 3.1引擎可以拥有自己的数据库,并且同时也可以访问主应用程序的数据库,例如用于用户认证。如果可能,我该如何配置?
谢谢。

您能否更清楚地表达您的问题?您所说的“主应用程序”是指什么? - Themasterhimself
我的意思是我把引擎附加到的应用程序。 - remcoh
你找到解决方案了吗? - Karolis
3个回答

5
是的,可以。我已经构建了使用单独sqlite3数据库的引擎。这样所有引擎的功能和数据都是隔离的。删除引擎,删除数据库,一切都不留痕迹。
首先,最好生成一个可安装引擎。这将创建一个命名空间并将引擎与主应用程序隔离开来。这不是必需的,但是最佳实践。我假设您已经在以下示例中完成了此操作。
在某个时候,您将在引擎内部生成模型。在引擎根路径下,键入以下内容:
$ rails generate resource Post

这将生成Post控制器、模型和路由。除了数据库迁移之外,一切都完美无缺。如果您想保持数据分离,则需要删除此迁移。引擎内的迁移的唯一目的是将它们复制到主应用程序的数据库中。所以,请继续摆脱它:
$ rm -r db

现在像平常一样连接你的根路由和控制器。
模型中还需要进行一个更改,以便将其连接到一个单独的数据库。
module YourEngine
  class Post < ActiveRecord::Base
    establish_connection :adapter => 'sqlite3', :database => 'db/your_engine.sqlite3'
  end
end

这样引擎的模型将不使用主数据库,而是您定义的数据库。理解的关键是,数据库文件不会存储在引擎内部!这个数据库文件存储在主机应用程序中。由于您将所有内容保持分开,因此必须手动创建此数据库。使用sqlite3命令行工具和手工制作的create语句是最快的方法:
$ cd "the root dir of the host rails app"
$ sqlite3 db/your_engine.sqlite3

从哪里创建表:

CREATE TABLE your_engine_posts (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name varchar(255) NOT NULL DEFAULT '', body text, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL);

瞧!现在只需要将引擎安装到您的应用程序中,启动它,一切都应该准备就绪。显然,由于引擎具有单独的数据库,所以使用迁移是没有用的。您需要手动更新模式。


如果我使用的是mysql2而不是sqlite呢?在你的示例中,你使用主机应用程序创建模式:sqlite3 db/your_engine.sqlite3。在使用mysql2的情况下,你会怎么做? - Donato
在这种情况下,您可以考虑在引擎内编写迁移,并在引擎文件夹内运行迁移。我没有尝试过这个。 - Joost Baaij
我的意思是,引擎可以有一个database.yml文件吗? - Donato

1
如果您担心表名与应用程序冲突,可以使用'isolate_namespace'方法。这将在您的引擎命名空间前缀所有表名。
Rails Casts刚刚发布了一个使用此功能的好教程,您应该去看看。

http://railscasts.com/episodes/277-mountable-engines


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接