2010-04-11 3 views
15

Ich frage mich, wie ich einen benutzerdefinierten Datentyp für die Verwendung in der Rake-Migrationsdatei erstellen konnte. Beispiel: Wenn Sie ein Modell erstellen, können Sie innerhalb der Migrationsdatei Spalten hinzufügen. Es könnte wie folgt aussehen:Rails: Erstellen eines benutzerdefinierten Datentyps/Erstellen einer Kurzschrift

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

Ich würde gerne wissen, wie so etwas zu schaffen:

t.column :name, :my_custom_data_type 

Der Grund hierfür zum Beispiel zum Erstellen eines „Währung“ -Typs, der nichts mehr als eine Dezimalstelle mit einer Genauigkeit von 8 und einer Skalierung von 2. Da ich nur MySQL verwende, reicht die Lösung für diese Datenbank aus.

Vielen Dank für Ihr Feedback und Kommentare!

+0

Die Verwendung von Fließkomma-Datentypen für Währungen ist im Allgemeinen eine schreckliche Idee. –

+0

Wenn Sie eine bessere Lösung haben, bitte erarbeiten Sie es. – Shyam

+1

Verwenden Sie etwas wie das Geld Juwel, http://money.rubyforge.org/. – theIV

Antwort

21

Sie möchten eine neue Spaltenerstellungsmethode definieren, die die Optionen zum Erstellen Ihres benutzerdefinierten Typs bietet. Dies geschieht im Wesentlichen durch Hinzufügen einer Methode, die sich in Migrationen wie t.integer ... verhält. Der Trick besteht darin, herauszufinden, wo dieser Code hinzugefügt werden soll.

Einige wo in Ihrem initializers Verzeichnis dieses Code-Snippet:

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 

Jetzt können Sie die Währung Methode verwenden Sie eine Währungsspalte definieren, wann immer Sie es brauchen.

Beispiel:

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

Um eine Währungsspalte zu einer vorhandenen Tabelle hinzufügen:

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

Caveat: Ich habe keine Zeit, um es zu testen, also gibt es keine Garantien. Wenn es nicht funktioniert, sollte es Sie zumindest auf die richtige Spur bringen.

+0

Ich werde das sofort testen. Danke für die Mühe und deine Hilfe! – Shyam

+0

Danke, ich hatte nur einen Nutzen dafür. Eine Sache zu beachten: "t" ist eine 'TableDefinition' in' create_table', aber eine 'Table' in' change_table'. Ich habe meinen Code für die benutzerdefinierte Generierung in ein Modul eingefügt und in beide Klassen aufgenommen. – Kolja

+0

Hi @emfi Das ist wirklich gut. Gibt es einen Weg, es weiter zu machen, als hätte man eine Modellwährung? Nur ein Gedanke, weil ich für z.B. für Validierungen der Währungseingabe an der gleichen Stelle auch..ich werde auch dafür .. thanks – sethi