Rails - 两个应用程序之间的共享数据库表

时间:2010-01-12 03:00:23

标签: mysql ruby-on-rails ruby database

我们将很快发布一个配套的Rails应用程序到我们现有的Rails应用程序。我们将在同一台服务器上与现有应用程序一起运行配套应用程序。

我的问题涉及数据库。我的托管服务提供商通常会为新应用程序配置第二个不同的数据库 - secondappname_production。但是,应用程序之间有一系列共享表。这些共享表也由一系列cron作业维护。我希望尽可能避免重复这些表(以及cron作业)。

有没有办法可以将这些共享表放在Rails应用程序可以利用的共享数据库中?有关如何配置该文档或文档指针的任何建议吗?

非常感谢!

编辑:澄清为什么我不想在同一个数据库中运行这两个应用程序:两个应用程序都有相同名称的模型(但模型的不同属性等),所以我宁愿不运行两者都来自同一个DB ....

2 个答案:

答案 0 :(得分:24)

您可以在一个数据库中存在一些模型(您要共享的模型),以及新应用程序自己的数据库中的其他模型(因此它们不会与现有应用程序冲突)。

要为特定模型指定其他数据库,请尝试以下操作:

class SharedModelBase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection(ActiveRecord::Base.configurations["shared_db_connection_#{RAILS_ENV}"])
end

现在,将它作为共享模型的基类,你应该好好去。

您的部分问题是最佳做法,因此还有其他一些选择。

一种选择是甚至不尝试直接访问数据库,而是使用ActiveResource在应用程序之间构建集成。让原始应用程序为这些表提供RESTful接口,并在新应用程序中使用它,并且根本不共享数据库。我喜欢这个选项,但可能不适合你的情况。

另一种选择是将这些共享表重构为自己的数据库,并让两个rails应用程序访问该数据库。您甚至可以最终为这两个应用程序使用的共享数据编写服务(例如,restful接口),然后您很好地解耦。

考虑此共享数据库结构何时更改的复杂性。如果您直接共享表,则可能必须同时更改两个rails应用程序以适应更改 - 您现在已经链接了您的发布计划,这些应用程序现在已经耦合。如果在服务中包装对db的访问,则可以提供抽象,因为您可以通过在旧服务接口的同时部署新的更新服务来同时为旧结构和新结构提供服务。这一切都取决于你的应用程序,如果这种复杂性是值得的。

答案 1 :(得分:0)

我认为你想要的是共享模型,不仅是数据库表,在rails表中是基于模型的。

create main rails app -->rake g model User name:string->rake db:migrate
create shared rails app 
-->rake sync:copy 
-->(DO NOT generate same model in shared app, also do not db:migrate)
-->config/generater shared
controller and router.rb file(dependend your requirement)

sync.rake(appshared / LIB /任务/)

namespace :sync do

      desc 'Copy common models and tests from Master'
      task :copy do
        source_path = '/Users/ok/github/appDataTester/appmain'
        dest_path = '/Users/ok/github/appDataTester/appshared'

        # Copy all models & tests
        %x{cp #{source_path}/app/models/*.rb #{dest_path}/app/models/}
        %x{cp #{source_path}/test/models/*_test.rb #{dest_path}/test/models/}

        # Fixtures
        %x{cp #{source_path}/test/fixtures/*.yml #{dest_path}/test/fixtures/}

        # Database YML
        %x{cp #{source_path}/config/database.yml #{dest_path}/config/database.yml}
      end
    end