vda*_*bry 5 ruby-on-rails heroku multiple-databases
我们在Heroku上托管了一个Rails应用程序,我需要为我们的营销人员设置一些分析页面.这似乎是Heroku 关注数据库的典型用例
2个数据库将共享相同的模型类,我只想要一些操作来查询复制的数据库.
在我的应用程序中处理这种情况的首选方法是什么?
ActiveRecord :: Base文档讨论了特定于类的连接:
您还可以设置特定于类的连接.例如,如果Course是ActiveRecord :: Base,但驻留在不同的数据库中,则可以说Course.establish_connection和Course及其所有子类将使用此连接.
我应该将所有模型类子类化以指定与辅助数据库的连接吗?(它会工作吗?)
我也发现了这个宝石,但它似乎不再维护.... magic_multi_connections gem?
jak*_*ils 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
Run Code Online (Sandbox Code Playgroud)
现在您的模型都连接到您的分析数据库(关注者).
如果您需要在分析应用程序和普通应用程序之间共享范围或方法,则可以将共享代码放在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
Run Code Online (Sandbox Code Playgroud)
这允许您共享模型之间的所有代码,无论它们是用于分析还是普通Web请求,而是根据型号名称设置不同的连接.
另外,作为旁注,如果您不想在开发环境中设置关注者,只需在development.rb中设置ENV ['ANALYTICS_DATABASE_URL']:
ENV['ANALYTICS_DATABASE_URL'] ||= 'postgres://localhost/myapp_development'
Run Code Online (Sandbox Code Playgroud)
显然,在Heroku上,您需要将ANALYTICS_DATABASE_URL的config var重命名或设置为跟随者的DATABASE_URL.
为了更好地回答这个问题:Heroku 现在发布了使用Octopus gem处理这种情况的“官方”方法:
https://devcenter.heroku.com/articles/distributing-reads-to-followers-with-octopus
有了这个 gem,就可以创建一个完全复制的模型,或者只在 follower 上执行一个块:
Octopus.using(:slave_two) do
User.create(:name => "Mike")
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3571 次 |
| 最近记录: |