2014-01-30 8 views
6

In Ruby on Rails, erstellt der folgenden Code in einer Migration eine Spalte vom Typ tinyint(4) in MySQL:Wie erstellt man in Ruby on Rails eine Spalte vom Typ Tinyint (2) oder Tinyint (3)?

create_table :great_table do |t| 
    t.integer :step_position, :limit => 1 #tinyint 
end 

Wie würde ich eine Spalte des Typs erstellen tinyint(2) oder tinyint(3)?

+1

Ich würde Sie von der Verwendung von 'Tinyint' an erster Stelle abraten. Es ist zu spezifisch. Ich wage zu erraten, dass es tatsächlich weniger leistungsfähig als ein einfaches Integer-Feld ist. Es kann Ihnen eine vernachlässigbare Menge an Speicherplatz pro Datensatz sparen, aber ich bin mir nicht einmal sicher, dass das der Fall ist. Ich denke, es würde Ihnen schwerfallen, mich davon zu überzeugen, dass es einen Grund gibt, es jemals zu benutzen. –

Antwort

0

Nach dem, was ich in dem Quellcode des Edelsteins zu sehen, kann man nicht:

 # File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 540 
    540:  def type_to_sql(type, limit = nil, precision = nil, scale = nil) 
    541:   return super unless type.to_s == 'integer' 
    542: 
    543:   case limit 
    544:   when 1; 'tinyint' 
    545:   when 2; 'smallint' 
    546:   when 3; 'mediumint' 
    547:   when nil, 4, 11; 'int(11)' # compatibility with MySQL default 
    548:   when 5..8; 'bigint' 
    549:   else raise(ActiveRecordError, "No integer type has byte size #{limit}") 
    550:   end 
    551:  end 

type_to_sql

+0

Nicht sicher, dass dies ein relevanter Codeschnipsel ist; Was ist dafür in der Oberklasse? Migrationen unterstützen einen ': tinyint'-Typ. In diesem Codeschnipsel entscheidet sich Rails, Ihre Typangabe ': integer' zu ignorieren und einen alternativen Typ zu verwenden, um kleinere/größere Ganzzahlwerte darzustellen, wenn sowohl': integer' als auch ': limit' angegeben sind. –

+0

Angst, dass Sie falsch liegen, type_to_sql wird von add_column aufgerufen. Sie können das im Code sehen: http://api.rubyonrails.org/v2.3.8/classes/ActiveRecord/ConnectionAdapters/MysqlAdapter.html#M001549 – FedeX

+0

Ich denke, dass ich falsch liegen kann, da es irgendeine Unterstützung für einen tinyint gibt der erste Ort (anders als indirekt aufgrund einer Integer- und Limit-Combo). Der obige Code wird sicherlich angewendet, wenn der Typ eine Ganzzahl ist. –

9

Für Tinyint (2)

create_table :great_table do |t| 
    t.integer :step_position, :limit => 2 
end 

Für Tinyint (3)

create_table :great_table do |t| 
    t.integer :step_position, :limit => 3 
end 
0

Sie können :tinyint als Spaltentyp in einer Schienenmigration verwenden und limit: 2 oder limit: 3 schreiben, wie zuvor beschrieben.

mit Ihrem Beispiel:

funktionieren sollte.

+0

Hey Kumpel, Sie können nicht Tinyint in der Migration verwenden, infizieren es sollte Integer und Limit 1 haben – Gagan

1

In MySQL gibt es in erster Linie nicht tinyint(4). tinyint ist eine ein Byte vorzeichenbehaftete ganze Zahl. Sie können alle Integer-Typen in der docs überprüfen. Sie können etwas wie tinyint(1) sogar in den Rails source code sehen, aber ich denke, es ist eine Tautologie, da tinyint bereits ein Byte Speicher impliziert.

Die Rails-Methode zum Deklarieren TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT in einer Migration ist limit: mit der entsprechenden Byte-Größe, wie in der source code zu sehen ist.

Beachten Sie, dass Rails standardmäßig Ein-Byte-Ganzzahlen als Boolean behandeln, wie aus dem obigen Link ersichtlich ist.