2016-12-02 1 views
3

Предположим, у меня есть класс ActiveRecord «Пользователь».Как узнать, что Rails загружает/кэширует атрибуты класса Activerecord?

Я понимаю, что в первый раз, когда я использую его через User.new, Rails делает вызов в базу данных, чтобы получить фактические атрибуты пользователя из таблицы users. Последующие времена кэшируются и не требуют вызова базы данных.

Это нормально .. и прямо в одной нити.

Предположим, что у меня несколько потоков, работающих в одном процессе. Первый поток, который вызывает 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, вы можете предположить, что кеш схемы отсутствует, и если это правда, вам нужно будет проверить идентификатор @columns вашего экземпляра schema_cache.

Это хаки, потому что шаблон Active Record предполагает, что объекты подключены к источнику данных. Если вам нужны объекты домена, которые не зависят от вашей БД, я бы рекомендовал писать их как ПОРО, используя Virtus + ActiveModel::Validation, или dry-struct и т. Д.

Смежные вопросы