Ошибка в активной записи при запросе результата из массива - PullRequest
0 голосов
/ 10 марта 2019

Если мы делаем на консоли:

> Product.all == Product.all.to_a
true

Но если мы делаем:

> Product.all.to_a.where(name: "something")
!! #<NoMethodError: undefined method `where' for #<Array:0x000055b42c6a3f20>>

Это не проблема, если мы не будем запускать этот метод 'to_a'.

Дело в том, что в этой статье о кэше heroku они показывают, как этот метод ниже использует кэширование:

def self.all_cached
  Rails.cache.fetch('Contact.all') { all.to_a }
end

И результат запроса, возвращенный этим методом, не может использовать active_record, потому чтоэто та же ошибка, что я объяснил ранее.

Моя главная цель - использовать кеширование и узнать, возможно ли преодолеть эту проблему с помощью подтверждения active_record в качестве работоспособного запроса, когда он находится в массиве.

1 Ответ

0 голосов
/ 10 марта 2019

Я решил проблему использования activerecord для результата кэшированного запроса с этим изменением:

с:

def self.all_cached
  Rails.cache.fetch('Contact.all') { all.to_a }
end

до:

   def self.all_cached
      Rails.cache.fetch("all_contacts") do
        Contact.all
      end
    end

Теперь это непеременная в массиве.

Эта проблема решена только частично, когда в статье heroku сказано, что лучший подход - преобразовать в массив:

Обратите внимание, что мы кэшируем все.to_a вместо всех.Это потому, что так как Rails 4 Model.all выполняется лениво, и вам нужно преобразовать Contact.all в массив с to_a для кэширования фактических контактов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...