Аналогичный вопрос, который я опубликовал . Автоматическое обновление атрибута в рельсах

Я очень новичок в Rails и JS. Недавно я начал создавать веб-приложение и столкнулся с некоторыми трудностями. Я отправил несколько вопросов, связанных, но не получил решение, которое я хотел.

Мой сценарий:

То, что я пытаюсь сделать, это то, что, когда пользователь A проверил пользователя B как немого, пользователь B исчезнет из списка друзей пользователя на определенное время (10 минут или 20 минут).

Структура данных:

У меня есть User модель с boolean attribute именем mute. mute устанавливается как false в качестве значения по умолчанию, а mute обновляется до true, когда пользователь выбирается из списка.

Главный вопрос:

Я вроде сделал что-то, что планировал построить, но понятия не имею как обновить mute до false еще раз через определенное время . Является там в любом случае, чтобы завершить это? Я искал некоторую информацию и некоторые люди говорили, что используйте каждый раз, когда драгоценный камень , но я не думаю, что это не то, что я хотел. Я буду очень признателен за вашу помощь. Еще раз спасибо.

0
js_beginner 21 Авг 2018 в 14:13

3 ответа

Лучший ответ

Вы можете использовать фоновый процесс, который может быть запущен через заданное время при обновлении поля mute на true. В этом процессе вы можете обновить поле обратно до false.

Вот некоторые примеры: отложенная работа , Backburner , Redis и т. Д.

https://github.com/collectiveidea/delayed_job

https://github.com/nesquena/backburner

1
Ravi Teja Dandu 21 Авг 2018 в 11:35

Вам нужно добавить еще один столбец, в котором хранится время muted_at, когда пользователь A отключает звук пользователя B, значение отключения звука становится ложным, а muted_at будет DateTime.current. В задании планировщика через каждые 5 секунд вы можете проверять, больше или меньше время ожидания, чем 30 минут. если оно превысило 20 минут, измените значение на false.

Вы можете использовать gem sidekiq для фоновой работы и gem sidekiq-scheduler для заданий по расписанию

В вашем случае вы можете создать один рабочий класс, который проверяет каждые 5 секунд, нужно ли вам менять значение отключения звука или нет.

:schedule:
  hello_world:
    cron: '0 * * * * *'   # Runs once per minute
    class: HelloWorld

HelloWorld будет вашей работой, которая запускается через каждую минуту и проверяет, превышает ли время отключения звука текущее время

Состояние будет как ниже

User.last.update_column(mute:, false) if muted_at + 20.minutes < DateTime.current

Таким образом, вы можете решить свою проблему. дайте мне знать, если вам нужно больше информации

1
Vishal 21 Авг 2018 в 12:40

Вы можете использовать следующий фрагмент кода:

setTimeout(function() {
// code
}, 1000);

Где 1000 в миллисекундах

-1
jvjayavardhan 21 Авг 2018 в 11:19
51947435