Я пишу метод экземпляра модели, который должен найти AR-ассоциацию, если он существует, или создать его, если это не так. Как я могу сделать это, чтобы после первого поиска база данных не запрашивалась снова? У меня есть две версии этого метода ниже, но у обоих есть недостатки.Самый эффективный способ не повторять вызов базы данных внутри метода?
Этот метод выполняет запрос каждый раз, когда он неэффективен.
def cart
carts.order('created_at desc').where(:purchased_at => nil).first || carts.create
end
Этот метод не только поиск дб один раз, но выходит из синхронизации после чего-то вроде cart.destroy.
def cart
@cart_ || @cart_ = carts.order('created_at desc').where(:purchased_at => nil).first || @cart_ = carts.create
end
Вау, это здорово. Я подумаю, что поеду с этим, но я не могу сказать, попадает ли он в кеш запросов. – pixelearth
См. Здесь: http://pastie.org/4062197 – pixelearth
Я * думаю * запрос кеширования происходит только во время фактических запросов. Сделайте «tail -f log/development.log» и проверьте вывод во время фактического запроса, и вы увидите «CACHE» вместо «Загрузка корзины», если он использует кеш соответствующим образом. – coreyward