2012-08-08 38 views
0

例如内工作,假设有在导轨3.2.3ActiveRecord的 - 一个连接

def test_action 
    a = User.find_by_id(params[:user_id]) 
    # some calculations..... 
    b = Reporst.find_by_name(params[:report_name]) 
    # some calculations..... 
    c = Places.find_by_name(params[:place_name]) 
end 

此代码3个请求到数据库,并打开3个不同的连接的代码。很可能这将是一个相当长的行动。

有没有办法打开只有一个连接,并在其中做3个请求?或者我想控制自己使用哪个连接。

+0

为什么你认为代码打开3个不同的连接?他们在不同的数据库中吗? – xdazz 2012-08-08 09:02:56

+0

我只是这么想的。 – Alexandre 2012-08-08 09:08:09

回答

1

你想与transaction含盖该呼叫:

事务将是SQL语句仅 永久性的,如果他们都可以作为一个原子操作成功保护块。典型的 示例是两个账户之间的转账,如果取款成功,您只能有 存款,反之亦然。事务 强制执行数据库的完整性,并防止程序错误或数据库崩溃的数据。所以基本上你应该使用 交易区块,只要你有一些必须 一起执行或根本不执行的语句。

def test_action 
    User.transaction do 
    a = User.find_by_id(params[:user_id]) 
    # some calculations..... 
    b = Reporst.find_by_name(params[:report_name]) 
    # some calculations..... 
    c = Places.find_by_name(params[:place_name]) 
    end 
end 

即使它们调用不同的模型动作封装到一个调用数据库。尽管如此,它是全部或没有。如果一个人在中间失败,那么整个胶囊失败。

虽然交易类方法被调用的一些活动记录 类,事务块内的对象不需要这个类的都是 实例。这是因为交易数据库为每个数据库 连接,而不是每个模型。

1

你可以看看ActiveRecord::ConnectionAdapters::ConnectionPool文档 此外AR不打开每个模型/查询的连接它重新使用现有的连接。

[7] pry(main)> [Advertiser.connection,Agent.connection,ActiveRecord::Base.connection].map(&:object_id) 
=> [70224441876100, 70224441876100, 70224441876100]