Я получаю дубликат вставки в таблицу базы данных из отложенных заданий - PullRequest
0 голосов
/ 05 июня 2019

У меня есть проверка на уровне кода, которая проверяет, должна ли быть вставлена ​​запись или нет. (Или с точки зрения бизнес-логики - дать пользователю
знак или нет).

Итак, в application_controller есть код (запускается при каждом запросе), который обновляет значение last_seen_at пользователя и последовательные посещения. Чтобы обновить эти значения, я запускаю следующий метод в delayed job перед каждым запросом. На каждом N-м последовательных посещениях сайта я даю пользователю значок. Но немногие пользователи имеют дубликаты значков.

def set_last_seen_at
  time = Time.current
  if last_seen_at.present? && last_seen_at.to_date == time.to_date
    update_columns(last_seen_at: time)
  elsif last_seen_at.present? && ((time.to_date - last_seen_at.to_date).to_i == 1)
    visits = consecutive_visits + 1
    update_columns(last_seen_at: time, consecutive_visits: visits)
    if (visits % 7).zero?
      add_badge('Weekly User')
    elsif (visits % 30).zero?
      add_badge('Monthly User')
    end
  else
    # if last seen is unset or last seen is greater than 1 day
    update_columns(last_seen_at: time, consecutive_visits: 1)
  end
end

Контроллер My Application:

before_action :set_last_seen_at, if: -> { current_user.present? && (current_user.last_seen_at.nil? || current_user.last_seen_at < 5.minutes.ago || current_user.last_seen_at.to_date != Time.zone.today) }

def set_last_seen_at
  DelayedJobThatRunsSetLastSeenAtForUser.perform_later(current_user.id)
end

Из приведенного выше кода пользователь должен получить значок Weekly User, если последним значением в последовательных посещениях было 6 и день прошел. Это работает хорошо, но, поскольку я просматривал базу данных, есть несколько пользователей, у которых есть повторяющиеся записи значка Weekly User, и созданный каталог для дублированных записей одинаков (с разницей в миллисекундах). Я не совсем уверен в этом поведении и был бы признателен за любую помощь в этом отношении.

Несколько указателей:

1) Я не могу добавить дубликат проверки на уровне базы данных, так как пользователи могут иметь дубликаты значков. например: они могут получить несколько Weekly User значок.

2) Я запускаю отложенное задание в фоновом режиме из службы systemd с rake jobs:work. (не уверен, поможет ли это, но я нашел это уникальным в моем случае). Поскольку приведенный выше код выполняется с задержкой, не должен ли он выполняться в одном процессе и потоке?

3) Могу ли я что-нибудь сделать, чтобы убедиться и проверить такое поведение. Единственное доказательство того, что у меня есть повторяющиеся записи - из записи базы данных.

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