Rails: Paranoia ile Veri Silmekten Korkmayın

1 minute read

“Bu veriyi silersem ileride lazım olur mu?”

“Eyvah! Yanlış veriyi sildim şimdi ne yapacağım?”

tarzında çeşitlendirilebilen kaygılarınız var ise paranoia gemi imdadınıza yetişecektir.

Peki nedir bu paranoia ve nasıl kullanılır?

Paranoia silme işleminde soft delete yapmamıza olanak sağlar. Yani veriyi sildiğimiz zaman aslında tam anlamıyla veritabanından o veriyi yok etmiş olmuyoruz.

Tabloya type’ı datetime olacak şekilde ekleyeceğimiz deleted_at alanı sayesinde silme işlemi yaptığımız zaman sadece bu kolonun değeri güncellenecek ve silinme zamanı burada tutulacak.

Bu plugin Active Record’un sadece destroy metodu üzerinde override yapmaz aynı zamanda find ve count metodları üzerinde de değişiklik yapar. Sql sorgularına deleted_at’i null olanların getirilmesiyle ilgili eklemeler getirecektir.

Migration ile modelimize deleted_at alanını ekleyelim:

$rails generate migration AddDeletedAtToUsers deleted_at:datetime:index

Migration dosya içeriğimiz:

class AddDeletedAtToUsers < ActiveRecord::Migration
  def change
    add_column :users, :deleted_at, :datetime
    add_index :users, :deleted_at
  end  
end
class User < ActiveRecord::Base
  acts_as_paranoid
  ...
end

Şimdi bir user silelim:

> User.count
# => 2

> User.last.destroy
# deleted_at güncellenecektir.

> User.count
# => 1

# Silinen veriler ile birlikte hepsini bulmak için:
> User.with_deleted

# Sadece silinen verileri bulmak için:
> User.only_deleted

User.count kullandığımızda veya find ile o user’ı bulmaya çalıştığımızda user silinmiş gibi davranacaktır ancak veritabanında users tablosuna baktığımız zaman bu silinmiş sandığımız kaydın hala orada durduğunu ve deleted_at alanının verinin silindiği zamanı tuttuğunu göreceğiz.

Peki paranoia ile hiçbir zaman veritabanından bir veriyi tam anlamıyla silemeyecek miyiz? Bunun da bir çözümü var. Herşeye rağmen kesinlikle silmek istediğimiz kayıtlar var ise:

 $User.last.really_destroy!

Eğer veritabanında tutacağımız kolon adının deleted_at yerine destroyed_at (veya herhangi birşey) olmasını istiyorsak:

class User < ActiveRecord::Base
  acts_as_paranoid column: :destroyed_at
  ...
end

Callback’ler ile kullanımı ve paranoia hakkında daha fazla bilgi için bakınız.

Ecmel Albayrak

Ecmel Albayrak

Subscribe

* indicates required

Intuit Mailchimp