Heroku的遵循:如何处理多个数据库的Rails应用程序?(Heroku follow : how

2019-07-31 08:02发布

我们托管在Heroku上一个Rails应用程序,我需要设置我们的营销人一些分析网页。 这似乎是典型的用例的Heroku的跟踪数据库

2.数据库将共享相同的模型类,我想只有一些行动来查询复制的数据库。

什么是处理我的应用程序这种情况下的最佳方法是什么?

的ActiveRecord :: Base的文档有关类特定连接会谈:

您还可以设置一个特定的类连接。 例如,如果场有一个ActiveRecord :: Base,但驻留在不同的数据库,你可以说Course.establish_connection和课程及其所有子类都将使用此连接来代替。

我应该继承我所有的模型类指定连接到辅助数据库? (将它甚至工作?)

我也发现了这种宝石,但似乎不再保持.... magic_multi_connections宝石 ?

Answer 1:

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

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,然后只包括在任何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请求您的模型之间的所有代码,但设置取决于模型的名称不同的连接。

此外,作为一个旁注,如果你不希望建立一个跟随在你的开发环境,只需设置ENV [“ANALYTICS_DATABASE_URL”]在您的development.rb:

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

很显然,在Heroku上,你需要重命名或设置配置VAR为您ANALYTICS_DATABASE_URL到任何你跟随的DATABASE_URL是。



Answer 2:

为了更好地回答这个问题:Heroku上已经贴出处理采用这种情况的“官方”的章鱼宝石 :

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

有了这个宝石有可能创造或者是完全复制的模式,或在跟随执行只有一个街区:

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


文章来源: Heroku follow : how to handle multiple databases in a Rails app?