“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.