【问题标题】:make queries on multiple db in same action controller with transaction rails?使用事务导轨在同一个动作控制器中查询多个数据库?
【发布时间】:2016-12-23 16:59:50
【问题描述】:

我的 database.yml 中有:

default: &default
  [...]

development_1:
  <<: *default
  database: dev1

development_2:
  <<: *default
  database: dev2

我需要在 foo 操作中进行许多查询,但使用这 2 个数据库:

class UsersController < ApplicationController

   def foo
      users_nb            = User.count #this use my default db : dev1
      other_connexion     = ActiveRecord::Base.establish_connection("#{Rails.env}_2").connection
      users_nb_other_site = connexion.execute("SELECT COUNT(*) FROM users").first[0]
   end

end

这行得通,但是我将所有动作控制器封装在事务中,例如:

ActiveRecord::Base.transaction do
  begin
    yield
  rescue Exception => e
    raise ActiveRecord::Rollback
end

这样,我以前的代码不起作用,它会引发错误:

ActiveRecord::StatementInvalid in UsersController#foo NoMethodError: nil:NilClass 的未定义方法“查询”您是说什么? to_query: 回滚

错误行是:ActiveRecord::Base.transaction do

那么我该如何做才能在另一个数据库上与我的主数据库同时进行连接和查询呢?

【问题讨论】:

    标签: mysql ruby-on-rails transactions database-connection multiple-databases


    【解决方案1】:

    好的,我的问题是我不明白 ActiveRecord::Base.establish_connection 也覆盖了我的第一个连接和交易。

    我创建了一个抽象类,就像这里所说的:https://makandracards.com/makandra/10169-when-connecting-to-a-second-database-take-care-not-to-overwrite-existing-connections

    class ReadDatabaseConnection < ActiveRecord::Base
      def self.abstract_class?
        true # So it gets its own connection
      end
    end
    
    ReadDatabaseConnection.establish_connection(slave_settings)
    

    我保持我的 2 连接这样,没有 pb !

    【讨论】:

    • 你拯救了我的一天!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2020-05-23
    • 2012-11-20
    • 2019-01-15
    • 1970-01-01
    • 2014-04-26
    相关资源
    最近更新 更多