Rails model non persistente

Uno degli aspetti più apprezzati di buona parte dei framework moderni, è l’ActiveRecord: attraverso questo strumento è possibile gestire con grande facilità i dati attraverso moltissime funzioni quali la possibilità di gestire in maniera quasi automatizzata un database oppure effetturare controlli sintattici sui dati inseriti.
In questi giorni, però, ho avuto la necessità di strutturare un model in Rails in cui tutti dati inseriti non devono essere persistenti e pertanto devono “morire” una volta utilizzati; per fare questo, sarebbe sufficiente creare una nuova classe che non eredita la classe ActiveRecord::Base, però, così facendo, si perdono le funzionalità di contollo automatico del form.
Ho scartato anche l’idea di creare un model ActiveRecord senza campi e con solo attributi “attr_accessor”, perchè si crea comunque una tabella vuota nel DB e, per pulizia, è una cosa che non mi piace.
Ecco come ho fatto io.
Innanzi tutto ho creato un nuovo model chiamato “EphemeralModel” che eredita ActiveRecord::Base

EphemeralModelSource Article
1
2
3
4
5
6
class EphemeralModel < ActiveRecord::Base
    def self.columns() @columns ||= []; end
    def self.column(name, sql_type = nil, default = nil, null = true)
        columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
    end
end

A questo punto possibile utilizzare la nuova classe come base per i nostri model non persistenti

NonPersistentEmail
1
2
3
4
class NonPersistentEmail < EphemeralModel
   column :email, :string
   validates_format_of :email, :with => /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/
end

La classe NonPersistentEmail è una classe ActiveModel a tutti gli effetti, per cui possiamo utilizzala con la funzione “form_for”, oppure (come da esempio) aggiungere una validazione… solo che i dati inseriti nel form saranno utilizzabili solo per l’elaborazione e non saranno salvati nel database.