2011-09-15 50 views
0

我正在使用一个公共站点和管理站点的Web应用程序。他们都共享一张桌子:用户,其模型在公共场所。我怎样才能与管理员应用程序分享这张桌子?如何在两个独立的ruby on rails应用程序之间共享表?

+2

你应该简单地配置你的'database.yml'文件来连接到同一个数据库。我会质疑你的设计决定,将它分成两个不同的应用程序。 – basicxman

+0

好吧,我如何配置database.yml文件连接到另一个应用程序中的表? –

回答

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 

你重复的模式现在将拉动数据来自您的公共数据库。您还可能需要在自己database.yml如定义developmenttest版本的公共数据库:

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

如果你不想复制你的用户模型,您可以将其拉出到一个单独的创业板使那个宝石成为一个Rails引擎。然后,您将能够将该宝石纳入您的公共和管理站点,并让这两种模型都可用。但是,如果您以这种方式执行操作,则需要在公共和管理员项目中都有额外的数据库定义(因为用户模型仍然需要establish_connection位)。

0

您可以在模型的顶部创建一个RESTful web服务,并从另一个应用程序调用此服务。 或者您可以使用您从其他应用程序调用的此类服务构建单独的用户应用程序。

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

0

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

让我们来想象我有两个应用一& B.

对于每一个你定义的database.yml指向同一个数据库。

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

config.active_record.table_name_prefix = "a_" 

,并分别应用B

config.active_record.table_name_prefix = "b_" 

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

a_posts 
b_transactions 

如果你想要的应用程序B来访问的例子中,用户表中创建一个表,

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

它的工作原理就像一个魅力。

相关问题