我的情况是我的应用需要根据请求连接到数据库。数据库的数据模型是相同的,但我需要并行连接到不同的数据库。例如,我的RESTful路线可能看起来像这样
/database/:database_id/user/:user_id # Get user :user_id from database :database_id
我查看了类似的问题,他们都建议使用ActiveRecord::Base#establish_connection
。然而,这些问题似乎并没有处理在使用相同模型类时同时访问多个数据库的情况。我担心的是,我将获得一个请求,建立连接,从数据库开始读取,但随后有一个新请求进来并更改ActiveRecord的连接。这是一个合理的担心吗?我使用Rails 3.0在Ruby 1.8.7上运行此代码。
感谢。 - 最大
答案 0 :(得分:3)
所以,我遇到了类似的问题,连接需要有点动态。我没有使用ActiveRecord,而是建议只使用db驱动程序。在我的情况下,它是一个遗留数据库,我不需要将记录变成一个我可以操作并保存回数据库的对象,它更多用于报告目的 - 我只需要结果聚合查询(仅限选择)。
对于这种情况,只需使用MySQL2 gem即可。这种方法允许Rails对应用程序中的某些东西(我想要/需要一个ORM)有所了解,但是当我真正需要连接到任意数据库以获取一些快速数据时,我可以灵活地避免AR。 / p>
所以这里有一些你想问自己的问题:
如果您不需要与CRUD操作类似ORM的功能,并且您可以通过一些简单的操作来完成,并且如果您不需要持久连接,我建议您继续使用使用数据库驱动程序。
HTH
答案 1 :(得分:0)
在 Rails 6 中,您可以使用多数据库功能:
class ShardRecord < ActiveRecord::Base
self.abstract_class = true
connects_to shards: {
club_1: { writing: :club_1, reading: :club_1 },
club_2: { writing: :club_2, reading: :club_2 }
}
end
class ApplicationController < ActionController::API
before_action :set_club
around_action :connect_to_shard
private
def set_club
@club = SelectClubByDomain.new(request).slug
end
def connect_to_shard
ActiveRecord::Base.connected_to(role: :writing, shard: @club.slug) do
yield
end
end
end
来源:
https://guides.rubyonrails.org/active_record_multiple_databases.html https://www.freshworks.com/horizontal-sharding-in-a-multi-tenant-app-with-rails-61-blog/ https://api.rubyonrails.org/classes/ActiveRecord/ConnectionHandling.html#method-i-connected_to_many