如何在两个独立的ruby on rails应用程序之间共享表?

时间:2011-09-15 02:54:13

标签: ruby-on-rails ruby

我正在开发一个包含公共站点和管理站点的Web应用程序。它们共享一个表:用户,其模型位于公共站点。如何与管理员应用共享此表?

4 个答案:

答案 0 :(得分:3)

如果我是你,我不会将公共和管理功能分开。而是将它们构建为同一站点的一部分,只需命名管理员路由并控制谁可以通过类似CanCan的内容访问管理功能(尽管您也可以轻松地手动滚动解决方案)。

如果您不能这样做,那么正如其他答案中指出的那样,您可以在管理站点中创建一个重复的用户模型,并覆盖该模型的连接以指向您的公共数据库。因此,在config/database.yml中,您需要为公共数据库添加数据库配置:

public_production:
  adapter: postgresql
  database: public_production
  username: blah
  password:
  host: localhost

#this is your existing production db
production:
  adapter: postgresql
  database: admin_production
  username: blah
  password:
  host: localhost

然后在您管理网站的重复用户模型中:

class User < ActiveRecord::Base
  establish_connection "public_#{RAILS_ENV}"
end

您的重复模型现在将从公共数据库中提取数据。您还可能需要在development中定义公共数据库的testdatabase.yml版本,例如:

public_development:
  adapter: postgresql
  database: public_development
  username: blah
  password:
  host: localhost

如果您不想复制用户模型,可以将其拉出到单独的gem中,并将该gem设为Rails引擎。然后,您可以将该gem包含在您的公共站点和管理站点中,并使两者都可以使用该模型。但是,如果以这种方式执行操作,则需要在公共项目和管理项目中都有额外的数据库定义(因为用户模型仍需要establish_connection位)。

答案 1 :(得分:0)

您可以在模型之上创建RESTful Web服务,并从其他应用程序调用此服务。 或者,您可以构建一个单独的用户应用程序,其中包含您从其他应用程序调用的服务。

为了深入了解这种设计,我推荐Paul Dix的书Service-Oriented Design with Ruby and Rails

答案 2 :(得分:0)

如果您设置两个AR连接,则涉及:

  1. 创建另一个UserOther模型
  2. 覆盖建立连接
  3. 实施例: Multiple database connection in Rails

    文档: http://apidock.com/rails/ActiveRecord/Base/establish_connection/class

    祝你好运

答案 3 :(得分:0)

创建两个不同的数据库可能很麻烦。 (例如,当你在heroku上托管你的应用程序时)。 您可以在唯一的数据库中执行相同的操作。

假设我有两个应用程序A&amp;乙

对于每个,您将database.yml定义为指向同一个数据库。

然后在application.rb中的每个项目上添加

config.active_record.table_name_prefix = "a_"

分别为app B

config.active_record.table_name_prefix = "b_"

所有表都有一个前缀。 例如:

a_posts
b_transactions

如果您希望应用B访问为用户表创建的表,

class User < ActiveRecord::Base
     self.table_name = "a_users"
end

它就像一个魅力。