2010-04-11 14 views
15

Mi chiedo come sia possibile creare un tipo di dati personalizzato da utilizzare all'interno del file di migrazione rake. Esempio: se si sta creando un modello, all'interno del file di migrazione è possibile aggiungere colonne. Potrebbe assomigliare a questo:Rails: creazione di un tipo di dati personalizzato/creazione di una stenografia

def self.up 
    create_table :products do |t| 
     t.column :name, :string 
     t.timestamps 
    end 
    end 

Vorrei sapere come creare qualcosa di simile:

t.column :name, :my_custom_data_type 

La ragione di questo per creare ad esempio un tipo di "valuta", che non è altro di un decimale con una precisione di 8 e una scala di 2. Poiché utilizzo solo MySQL, la soluzione per questo database è sufficiente.

Grazie per il vostro feedback e commenti!

+0

L'utilizzo di tipi di dati a virgola mobile per la valuta è in genere una pessima idea. –

+0

Se si dispone di una soluzione migliore, si prega di elaborare. – Shyam

+1

Usa qualcosa come la gemma del denaro, http://money.rubyforge.org/. – theIV

risposta

21

Quello che stai cercando di fare è definire un nuovo metodo di creazione colonna che fornisce le opzioni per creare il tuo tipo personalizzato. Che viene fatto essenzialmente aggiungendo un metodo che si comporta come t.integer ... nelle migrazioni. Il trucco sta nel capire dove aggiungere quel codice.

Alcuni dove nel tuo inizializzatori directory posto questo frammento di codice:

module ActiveRecord::ConnectionAdapters 
    class TableDefinition 
    def currency (*args) 
     options = args.extract_options! 
     column_names = args 
     options[:precision] ||= 8 
     options[:scale] ||= 2 
     column_names.each { |name| column(name, 'decimal', options) } 
    end                  
    end 
end 

Ora è possibile utilizzare il metodo di valuta fare definire una colonna di valuta in qualsiasi momento avete bisogno.

Esempio:

def self.up 
    create_table :products do |t| 
    t.currency :cost 
    t.timestamps 
    end 
end 

Per aggiungere una colonna di valuta a una tabella esistente:

def self.up 
    change_table :products do |t| 
    t.currency :sell_price 
    end 
end 

Caveat: non hanno il tempo di testarlo, quindi non c'è nessuna garanzia. Se non funziona, dovrebbe almeno metterti sulla giusta strada.

+0

Ho intenzione di testare questo subito. Grazie per lo sforzo e il tuo aiuto! – Shyam

+0

Grazie, ho appena avuto un uso per questo. Una cosa da notare: 't' è una' TableDefinition' in 'create_table', ma una' Table' in 'change_table'. Ho inserito il mio codice di generazione personalizzato in un modulo e incluso in entrambe le classi. – Kolja

+0

Ciao @emfi Questo è davvero buono .. C'è un modo per portarlo ulteriormente come avere una valuta Modello? Solo un pensiero perché voglio per es. per convalide di input di valuta nello stesso posto anche ... Cercherò anche che ... grazie – sethi

Problemi correlati