"не могу сбросить файл" во время "Rails.cache.fetch" и "Rails.cache.write" - PullRequest
1 голос
/ 23 июня 2011

Я работал над переносом приложения на «Rails 3.0.7» с тех пор, как начал использовать кеширование для своего приложения (файловый кеш, memcache или любой другой).Я всегда получаю вышеупомянутую ошибку «не могу сбросить файл».

Я немного погуглил и обнаружил, что это как-то связано с дампом Marshal, так как интерпретатор ruby ​​разрешает дамп Marshal объекта, у которого есть Procs илилямбды в них, поэтому я посмотрел на свой код, но я не смог найти ни одного Proc и лямбда во всех моих приложениях

Теперь, чтобы обнаружить проблему, я углубляюсь в код ActiveRecord 3.0.7, и вот несколько интересных находок, которые япридумали

1."include" в Rails 3 + внутренне вызовите определение name name ОК, я отвечаю, что есть Proc и Lambada, связанные собъект, поэтому ошибка , но это не объясняет, почему один и тот же код иногда работает и сообщает об ошибках (выше ошибок) в других случаях я имею в виду, если ошибка относится к Marshalling и объектукоторые содержат Proc или Lambada, тогда код определенно не должен работать и всегда должен сообщать об ошибках независимо от того, сколько раз один и тот же код запускается , ноздесь дело обстоит иначе код возврата ошибки иногда и хорошо работают другие времена

код

Rails.cache.fetch ("available_websites_1") {Website.includes (: account)}

2. Если ". включает" в Rails 3.0 +, естьПроблема в том, что с синтаксисом other 'include' он тоже сообщает об ошибке (ошибка выше), поэтому я запустил код с более старым синтаксисом из include

Вот оно

Rails.cache.fetch ("available_websites_1") {Website.all (: include =>: account)}

что удивительнозапустился, но он никогда не загружал предварительно учетную запись, связанную с для всего сайта (что и странно) , но по крайней мере он никогда не выдавал ошибку, так что еще раз была проведена экспертиза на Active Record 3.0 + дляузнайте, как более старая версия включает (Rails 2.3 +), работает с удивлением, узнав, что более старая версия включает синтаксис внутренний вызов .include метод ActiveRecord 3.0 +

whoo Как такое возможно, что два разных синтаксиса оба вызывают один и тот же внутренний метод один отчет с ошибкой иногда (некаждый раз, но предварительно загружая связанный объект ) и другие не не сообщает с ошибкой , но и не предварительно загружает связанный объект , как было сказано ранее.

Ладно, выслушав все это, если кто-нибудь может мне помочь, тогда я был бы очень признателен

Кстати

Вот что я пытаюсь достичь

Rails.cache.fetch ("available_websites_1") {Website.includes (: account)}

эквивалентный код выше в Rails 2.3.5 и Rails 3+ (но не предварительно загружает связанный объект учетной записи всех веб-сайтов), т. Е.

Rails.cache.fetch ("available_websites_1") {Website.find (: all,: include =>: account)}

Отлично работает без каких-либо проблем

Я использую

Ruby = "ruby 1.8.7 (2010-01-10 patchlevel 249)[i486-linux] "Rails =" Rails 3.0.7 "

Та же проблема сохраняется даже на Rails 3.1.0

Я что-то упустил

Я также могу предоставить структуру модели, если требуется

1 Ответ

1 голос
/ 28 ноября 2011

Проблема в том, что

Website.includes(:account)

не загружает данные, он просто предоставляет вам прокси-объект, который будет загружать объекты по запросу, когда вы делаете что-то вроде вызова #each или #to_s, если вы вызываете выборку, добавляя #to_a в конец это должно работать, например попробовать

Marshal.dump(Website.includes(:account))
Marshal.dump(Website.includes(:account).to_a)

#all(x=>y) не делает то же самое, что #x(y), поэтому вы можете сделать X.includes.joins.where, но не X.all.where.

Не знаю, откуда взялась ссылка на File.

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