我应该如何处理2个应用程序和1个数据库的迁移

时间:2014-04-04 20:17:21

标签: ruby-on-rails postgresql

在我们的项目中,我们有2个不同的应用程序(如果您考虑resque worker,则为3个),它们在远程数据库服务器中为同一个数据库使用不同的用户。

这个想法是一个应用writes stuff on db而另一个reads stuff from db。它们都具有相同属性的相同模型,但出于安全考虑,一个应用程序无法在任何情况下写入db。

由于这种设置,我有一些问题:

  1. 如何确保开发中的两个应用都具有相同的迁移?我应该在一个上运行迁移并复制代码吗?
  2. 如果我在一个模型上更改某些内容,同步更改的最佳方法是什么?
  3. 我应该如何处理capistrano迁移数据库?我应该忽略它吗?或者我应该创建一些逻辑来阻止迁移后面的服务器吗?
  4. 修改

    我做了一些研究,发现了一些我仍然不自信的解决方案。

    1. 创建宝石以保存模型数据
      1. 处理太乱了
      2. 对于一个小小的改变,我需要做很多事情来更新宝石
    2. 使用git submodulegit subtree
      1. 不太直白
      2. 很高兴处理共享模型,但我不知道如何处理迁移
    3. 编辑2

      我为每个应用程序配置了这个配置:

      # worker and admin, where i need to write
      production:
        adapter: mysql2
        encoding: utf8
        reconnect: false
        database: my_huge_db_production
        pool: 5
        username: full_access_user
        password: password
        socket: /tmp/mysql.sock
      
      # api, where i only need to read
      production:
        adapter: mysql2
        encoding: utf8
        reconnect: false
        database: my_huge_db_production
        pool: 5
        username: only_read_access_user
        password: password
        socket: /tmp/mysql.sock
      

      我最大的问题是如何同步我的模型和迁移的所有更改,因此当我部署时我可以说:只在管理应用上调用迁移

2 个答案:

答案 0 :(得分:0)

最好的方法是将数据库移动到Master Slave设置。 您将在运行单个数据库时运行迁移。它会自动反映在其他地方。 你将从Slave数据库中读取并在Master上进行写作。

答案 1 :(得分:0)

sinatra应用程序只是为了暴露api,所以它不应该告诉你模型和表格的业务规则。

resque应用程序只是处理繁重的i / o,长请求和东西。它也不应该告诉你。

rails应用程序是您最重要的应用程序,因为它应该处理您的所有业务逻辑,用户界面(html / css / javascript)。它会告诉你api应该是怎样的,因为你的api是基于它定义的模型。我认为那是处理迁移的人。

如果你更深入,你会发现rails app是你系统的中心点。 =)