2012-08-08 69 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] 
相關問題