2016-12-02 59 views
3

假設我有一個ActiveRecord類「用戶」。我如何知道Rails已經加載/緩存了一個Activerecord類的屬性?

我意識到我第一次通過User.new使用它,Rails調用數據庫以從用戶表中獲取用戶的實際屬性。隨後的時間它被緩存,並且不需要數據庫調用。

這很好..在單線程中很簡單。

假設我有多個線程在一個進程中運行。調用User.new的第一個線程(或者涉及用戶的任何內容,比如查找一個)將查找數據庫中的屬性。隨後的將會讓他們緩存。

有沒有辦法檢查ActiveRecord屬性是否被緩存?

當我不打算使用數據庫連接時,我不想總是通過ActiveRecord :: Base.connection_pool.with_connection檢查數據庫連接,當我調用User.new時 - 是,甚至沒有保存它。

u = nil 

ActiveRecord::Base.connection_pool.with_connection do # I don't want to checkout a conn if User attributes are cached. 
    u = User.new 
end 

#manipulation of u. but u.save NEVER ever gets called. 

我不會完全解釋我的整個推理,但這樣做會減少人們回答,因爲一句話:這很複雜。這裏有一篇文章,如果感興趣,雖然這是類似於我的問題:https://bibwild.wordpress.com/2014/07/17/activerecord-concurrency-in-rails4-avoid-leaked-connections/我基本上不想檢查數據庫連接,如果可能的話,但仍然想調用User.new來操縱它,但不保存它。

回答

0

是的,沒有。實際的模式緩存可以在ActiveRecord::Base.connection.schema_cache下找到,但調用connection的行爲會導致它被打開。如果ActiveRecord::Base.connected?如果爲false,則可以假定沒有模式緩存,如果爲true,則必須檢查schema_cache實例的@columns ivar。

這很冒險,因爲活動記錄模式假定對象連接到數據源。如果您需要與您的數據庫無關的域對象,我建議使用Virtus + ActiveModel::Validationdry-struct等將它們編寫爲PORO。

相關問題