2016-12-02 2 views
3

ActiveRecordクラス "User"があるとします。RailsがActiverecordクラス属性をロード/キャッシュしていることをどのように知ることができますか?

私はUser.newを使って初めて使用することを認識しています.Railsはデータベースの呼び出しを行い、ユーザーの実際の属性をusersテーブルから取得します。その後、キャッシュされ、データベース呼び出しは必要ありません。

これは単スレッドでは問題ありません。

複数のスレッドを1つのプロセスで実行しているとします。 User.newを呼び出す最初のスレッド(またはUserを含むものなど)は、データベース内の属性を検索します。後続のものはキャッシュされます。

ActiveRecord属性がキャッシュされているかどうかを確認する方法はありますか?

データベース接続の使用を計画していないときに、User.newを呼び出すと、常にActiveRecord :: Base.connection_pool.with_connectionを介してデータベース接続をチェックアウトする必要はありません。それを保存します。

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の場合、スキーマキャッシュがないとみなすことができます。それが真実なら、schema_cacheインスタンスの@columnsのivarを検査する必要があります。

アクティブレコードパターンは、オブジェクトがデータソースに接続されていることを前提としているため、これはハッキーです。 DBとは独立したドメインオブジェクトが必要な場合は、Virtus + ActiveModel::Validation、またはdry-structなどを使用してPOROとして書くことをお勧めします。

関連する問題