我正在开发一个包含公共站点和管理站点的Web应用程序。它们共享一个表:用户,其模型位于公共站点。如何与管理员应用共享此表?
答案 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
中定义公共数据库的test
和database.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连接,则涉及:
实施例: 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
它就像一个魅力。