Modele timeout ekleme

Öncelikle herkese iyi forumlar.
Logger adında bir modelim var ve bu modelde bir boolean kabul eden online kısmı var. Bu kısmın belirli bir süreden sonra false olmasını istiyorum.
Mesela timeout:60 diye atadığımda online kısmının altmış dakika sonra false olmasını istiyorum. Bunu nasıl yapabilirim ?

Şimdiden teşekkürler.

Benim Aklıma İki farklı yöntem geliyor, senin use case’ine hangisi uyarsa o daha doğru olur.

  1. Eğer Database check’ini Rails harici biryerden yapıyorsan, background worker kullanarak bir zamanlayıcı oluşturman gerekir. Benim kullandığım gemlerden birisi delayed_job işini görebilir.
  2. Eğer sen bu column’un true/false kontrolünü yine Rails üzerinden yapıyorsan, Logger modeline yeni bir ‘last_activity_at’ column’u ekleyip, get yapmadan önce şöyle birşey yapabilirsin.
timeout = 1.hours.ago.strftime("%Y-%m-%d %M:%S")
Logger.where(last_activity_at: timeout).update_all(online: false)

tabi her aktivitede last_activity_at column’unu touch ile update etmen gerekli.

kolay gelsin :slight_smile:

1 Like

Eğer Rails 7 ve postgresql12 kullanıyorsanız virtual column yazabilirsiniz.

Şuna benzer bir migration işinizi görmeli.

change_table :loggers do |t|
  t.interval :timeout, 
  t.virtual :online, type: :boolean, as: 'created_at + timeout < now()', stored: true
end
logger = Logger.create({timeout: 60.minutes})

# timeout olunca
logger.online # false
3 Likes

Hocam bunu datetime olarakmı ekleyeceğim ?

@berkan hocam sizde sağolun birgün rails 7'ye geçersem deneyeceğim :slight_smile:

evet.

minimum 20 karakter yazmam gerekiyormus, gereksiz bir cumle birakiyorum buraya :slight_smile:

1 Like

Sidekiq ile Scheduled job kullanarak model katmanındaki güncelleme işleminden sonra istediğiniz zamanda tetiklenmek üzere bir zamanlanmış görev başlatabilirsiniz. Job başladığında da aynı resource’a ulaşıp ilgili değeri tekrar güncelleyebilirsinz.

Bu akış haricinde periyodik olarak çalışacak arkaplan işleri var ise aşağıdaki araçlar işinizi görür;

Kolaylıklar.

3 Likes

@selcuktoklucu hocam peki bu alanı nasıl eklememi önerirsiniz ?
Mesela created_at alanındaki veriyi burayamı atamalıyım ?
Nasıl değer ataması yapmam gerekiyor ?

Senin online column’u nasil kullanacagini bilemiyorum. O yuzden sadece tahmin yurutebilirim.

Online kisimdan bahsetmistin, o yuzden created_at'i kullanman mantikli degil. update_at'i kullanabilirsin, ancak sadece her model guncellemesinden sonra timeout olana kadar online kalmis olur, oda mantikli degil.

Sanirim yeni bir column yaratmak daha mantikli geliyor bana.
hatta bir seviye daha ileri giderek online column’u yaratmak yerine sadece last_logger_activity_at column’u yaratip, sonrasinda online? diye bir method tanimlayip sadece last_activity_at column’u son 1 saat icinde mi diye bir check yapabilirsin. Boylelikle tekrar ikinci bir islem update islemi yapmamis olursun

1 Like