Mantenere questo semplice. Diciamo che ho un modello User
e un modello Post
:Come nascondere i record, piuttosto che eliminarli (eliminazione graduale da zero)
class User < ActiveRecord::Base
# id:integer name:string deleted:boolean
has_many :posts
end
class Post < ActiveRecord::Base
# id:integer user_id:integer content:string deleted:boolean
belongs_to :user
end
Ora, supponiamo che un amministratore vuole "eliminare" (nascondere) un post. Quindi, in pratica, tramite il sistema, imposta l'attributo deleted
di post a 1
. Come dovrei ora visualizzare questo post nella vista? Devo creare un attributo virtuale sul post come questo:
class Post < ActiveRecord::Base
# id:integer user_id:integer content:string deleted:boolean
belongs_to :user
def administrated_content
if !self.deleted
self.content
else
"This post has been removed"
end
end
end
Mentre che avrebbe funzionato, voglio implementare quanto sopra in un gran numero di modelli, e non posso fare a meno che Copy + incollando il sopra comparativo in tutti i miei modelli potrebbe essere DRYer. Molto più asciutto
Penso anche che inserire una colonna deleted
in ogni singolo modello cancellabile nella mia app sia un po 'macchinoso. Sento che dovrei avere un tavolo 'stato'. Quali sono i vostri pensieri su questo:
class State
#id:integer #deleted:boolean #deleted_by:integer
belongs_to :user
belongs_to :post
end
e poi interrogare self.state.deleted
nel comparatore? Questo richiederebbe un tavolo polimorfico? Ho provato solo una volta polimorfico e non ho potuto farlo funzionare. (era su un modello autoreferenziale piuttosto complesso, mente). E questo ancora non affronta il problema di avere un metodo di classe molto, molto simile nei miei modelli per verificare se un'istanza viene eliminata o meno prima di visualizzare il contenuto.
Nell'attributo deleted_by
, sto pensando di posizionare l'id dell'amministratore che l'ha eliminato. Ma che dire quando un amministratore ripristina un post? Forse dovrei avere solo un id edited_by
.
Come impostare una relazione di tipo dependent: :destroy
tra l'utente e i suoi messaggi? Perché ora voglio fare questo: dependent: :set_deleted_to_0
e non sono sicuro di come farlo.
Inoltre, non vogliamo semplicemente impostare gli attributi cancellati del post su 1, perché in realtà vogliamo cambiare il messaggio che emette il nostro administrated_content
. Ora vogliamo che dica, This post has been removed because of its user has been deleted
. Sono sicuro di poter entrare e fare qualcosa di hacky, ma voglio farlo correttamente sin dall'inizio.
Cerco anche di evitare gemme quando posso perché sento che mi sto perdendo l'apprendimento.
Di solito uso un campo 'deleted_at' che è un campo datetime. Quando questo campo è completato, significa che questo record è cancellato (si comporta come un booleano ma fornisce una data) – MrYoshiji
Dai un'occhiata a paranoia gem -> https://github.com/radar/paranoia – usha