rails 3.1引擎和数据库

时间:2011-07-04 09:12:54

标签: ruby-on-rails rails-engines

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

感谢

3 个答案:

答案 0 :(得分:5)

是的,他们可以。我已经构建了使用单独的sqlite3数据库的引擎。这样,所有引擎的功能和数据都是隔离的。删除引擎,删除数据库,一切都没有留下痕迹。

首先,您最好生成mountable engine。这会创建一个命名空间,并将引擎与主应用程序隔离开来。这不是要求,而是最佳做法。我假设您已经完成了以下示例。

有一次,您将在引擎内生成模型。在引擎根路径中,键入以下内容:

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

的Presto!现在只需将引擎安装在您的应用程序中,启动它就应该准备就绪了。显然现在您的引擎有一个单独的数据库,它与迁移一起使用是没有用的。您必须手动更新架构。

答案 1 :(得分:1)

如果您担心与应用程序发生冲突的表名,可以使用'isolate_namespace'方法。这将为您的所有表名添加前缀的引擎名称。

Rails Casts只是有一个很好的教程,使用它,你应该检查出来。

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

答案 2 :(得分:0)

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