У меня есть проверка на уровне кода, которая проверяет, должна ли быть вставлена запись или нет. (Или с точки зрения бизнес-логики - дать пользователю
знак или нет).
Итак, в 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) Могу ли я что-нибудь сделать, чтобы убедиться и проверить такое поведение. Единственное доказательство того, что у меня есть повторяющиеся записи - из записи базы данных.