Heroku遵循:如何在Rails应用程序中处理多个数据库?

时间:2012-09-02 19:07:29

标签: ruby-on-rails heroku multiple-databases

我们在Heroku上托管了一个Rails应用程序,我需要为我们的营销人员设置一些分析页面。这似乎是Heroku follow database

的典型用例

2个数据库将共享相同的模型类,我只想要一些操作来查询复制的数据库。

在我的应用中处理这种情况的首选方法是什么?

ActiveRecord::Base documentation讨论了特定于类的连接:

  

您还可以设置特定于类的连接。例如,如果课程   是一个ActiveRecord :: Base,但你可以驻留在不同的数据库中   只需说一下Course.establish_connection和Course以及它的所有内容   子类将使用此连接。

我应该将所有模型类子类化以指定与辅助数据库的连接吗? (它会工作吗?)

我也找到了这个宝石,但它似乎不再保持...... magic_multi_connections gem

2 个答案:

答案 0 :(得分:11)

所以...我喜欢这个解决方案:

module Analytics

  class Base < ActiveRecord::Base
    self.abstract_class = true
    establish_connection ENV['ANALYTICS_DATABASE_URL']
  end

  class User < Base; end

  class Product < Base; end

end

现在您的模型都连接到您的分析数据库(关注者)。

如果您需要在分析应用和普通应用之间共享范围或方法,可以将共享代码放在mixin中,然后将其包含在您的Google Analytics或普通模型中。

或者,您可以在使用它们进行分析之前,在控制器中需要用于分析的模型上调用.establish_connection,但我不知道这是否会破坏您与其他正常Web请求的连接,要求您在下次请求时将其设置回正常的数据库连接...

更新:另一个想法让我印象深刻:

class UserBase < ActiveRecord::Base
  self.abstract_class = true
  # all your user model code goes here
end

class User < UserBase
  establish_connection(Rails.env) # connect to your normal database
end

class AnalyticsUser < UserBase
  self.table_name = 'users'
  establish_connection(ENV['ANALYTICS_DATABASE_URL'])
end

这使您可以共享模型之间的所有代码,无论它们是用于分析还是普通Web请求,而是根据型号名称设置不同的连接。

另外,作为旁注,如果您不想在开发环境中设置关注者,只需在development.rb中设置ENV ['ANALYTICS_DATABASE_URL']:

ENV['ANALYTICS_DATABASE_URL'] ||= 'postgres://localhost/myapp_development'

显然,在Heroku上,你需要将ANALYTICS_DATABASE_URL的config var重命名或设置为跟随者的DATABASE_URL。

答案 1 :(得分:4)

为了更好地回答这个问题:Heroku现在发布了一个&#34;官员&#34;使用Octopus gem

处理这种情况的方法

https://devcenter.heroku.com/articles/distributing-reads-to-followers-with-octopus

使用这个gem,可以创建一个完全复制的模型,或者只在跟随者上执行一个块:

Octopus.using(:slave_two) do
  User.create(:name => "Mike")
end