Rails Несогласованные результаты базы данных - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть приложение Rails, в котором есть запрос на создание элементов таблицы и еще одно, ожидающее, которое читает, был ли создан такой элемент или нет.

Прямо сейчас я проверяю действующие данные ипроцесс ожидания никогда не увидит никакой новой записи для таблицы.

Есть идеи, как форсировать переподключение или что-нибудь, что обновит ссылку на модель?

Основная идея:

  • Один пользователь с помощью POST создает запись (которую я вижу непосредственно в базе данных).
  • Другой фрагмент кода, который выполнялся перед запросами, ожидает этой записи, ноне находит его.

Буду признателен за любые идеи.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Ожидающий запрос, вероятно, использует кэш ActiveRecord.Rails кэширует запросы на время запроса, поэтому, если вы выполняете один и тот же запрос несколько раз в одном запросе, он попадет в базу данных только в первый раз.

Вы можете смоделировать это в консоли:

Entity.cache { Entity.first; Entity.first }

В журналах вы увидите что-то вроде этого (обратите внимание, что второй запрос говорит CACHE):

[2018-12-06T10:51:02.436 DEBUG (1476) #] Entity Load (4.9ms)  SELECT "entities".* FROM "entities" LIMIT 1
[2018-12-06T10:51:02.450 DEBUG (1476) #] CACHE (0.0ms)  SELECT "entities".* FROM "entities" LIMIT 1

Чтобы обойти кеш, вы можете использовать:

Entity.uncached { Entity.where(key: @key)&.last }

Использование uncached отключит кэш внутри блока, даже если охватывающая область работает внутри блока cached.

0 голосов
/ 06 декабря 2018

Похоже, что для работающего приложения Rails, если работающий фрагмент кода ищет что-либо, что было обновлено новым запросом, после того, как первый начал его выполнение, обновленные данные не будут показаны с использованием моделей active_record.

Решение: просто запустите необработанный запрос.

sql = "SELECT * FROM entities WHERE key = '"+key+"' ORDER BY ID DESC LIMIT 1;" records_array = ActiveRecord::Base.connection.execute(sql).values

Я знаю, что это огромное упрощение и что, возможно, есть основная проблема, но она все же решила ее.

...