4

rails 3.1 引擎可以拥有自己的数据库,同时还可以访问主应用程序的数据库,例如用于用户身份验证如果可能,我该如何配置?

谢谢

4

3 回答 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 命令行工具和手工创建的语句是最快的:

$ 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);

快!现在只需将引擎安装到您的应用程序中,启动它,它就应该准备好运行了。显然,既然您的引擎有一个单独的数据库,那么使用迁移是没有用的。您将不得不手动更新架构。

于 2012-07-06T15:21:01.583 回答
1

如果您担心表名与应用程序冲突,您可以使用“isolate_namespace”方法。这将为您的所有表名加上引擎的命名空间。

Rails Casts 刚刚有一个很好的教程使用它,你应该检查一下。

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

于 2011-08-03T05:46:01.150 回答
0

是的他们可以。我在这里写了一个指南 http://railsforum.com/viewtopic.php?id=42143

于 2011-08-03T05:54:40.317 回答