我们托管在Heroku上一个Rails应用程序,我需要设置我们的营销人一些分析网页。 这似乎是典型的用例的Heroku的跟踪数据库
2.数据库将共享相同的模型类,我想只有一些行动来查询复制的数据库。
什么是处理我的应用程序这种情况下的最佳方法是什么?
的ActiveRecord :: Base的文档有关类特定连接会谈:
您还可以设置一个特定的类连接。 例如,如果场有一个ActiveRecord :: Base,但驻留在不同的数据库,你可以说Course.establish_connection和课程及其所有子类都将使用此连接来代替。
我应该继承我所有的模型类指定连接到辅助数据库? (将它甚至工作?)
我也发现了这种宝石,但似乎不再保持.... magic_multi_connections宝石 ?
所以...我喜欢这样的解决方案:
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是。
为了更好地回答这个问题:Heroku上已经贴出处理采用这种情况的“官方”的章鱼宝石 :
https://devcenter.heroku.com/articles/distributing-reads-to-followers-with-octopus
有了这个宝石有可能创造或者是完全复制的模式,或在跟随执行只有一个街区:
Octopus.using(:slave_two) do
User.create(:name => "Mike")
end