Ruby on rails rails 3.1引擎和数据库

Ruby on rails rails 3.1引擎和数据库,ruby-on-rails,rails-engines,Ruby On Rails,Rails Engines,rails 3.1引擎是否可以拥有自己的数据库,同时也可以访问主应用程序的数据库,例如用于用户身份验证 如果可能,我如何配置它 谢谢如果您担心表名与应用程序冲突,可以使用“隔离名称空间”方法。这将使用引擎的名称空间作为所有表名的前缀 Rails Casts刚刚有一个很好的教程使用了这个,你应该去看看 是的,他们可以。 我在这里写了一本指南 是的,他们可以。我已经构建了使用单独的sqlite3数据库的引擎。这样,所有引擎的功能和数据都被隔离。删除引擎,删除数据库,一切都消失了,没有留下任何痕迹 首

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


谢谢

如果您担心表名与应用程序冲突,可以使用“隔离名称空间”方法。这将使用引擎的名称空间作为所有表名的前缀

Rails Casts刚刚有一个很好的教程使用了这个,你应该去看看

是的,他们可以。 我在这里写了一本指南
是的,他们可以。我已经构建了使用单独的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
从创建表的位置:

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呢?在您的示例中,您使用:sqlite3db/your_engine.sqlite3在主机应用程序中创建模式。在MySqL2的情况下,你会做什么?在这种情况下,你可以考虑在引擎内部写迁移,并在引擎文件夹中运行迁移。我没有试过这个。我的意思是我可以有一个引擎的database.yml吗?
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);