Rails 4.1 - Schreiben Sie in die MySQL-Datenbank ohne Typumwandlung

9

Ich habe eine Spalte in meiner MySQL-Datenbank vom Typ TINYINT (1). Ich muss die tatsächlichen ganzen Zahlen in dieser Spalte speichern. Das Problem ist, dass Rails 4.1 aufgrund des Spaltentyps davon ausgeht, dass diese Spalte nur boolesche Werte enthält, so dass beim Schreiben in die Datenbank alle Werte außer 0 oder 1 als 0 eingegeben werden.

Ich möchte die boolesche Emulation nicht einfach deaktivieren, da wir in unserer Datenbank eine Reihe von Spalten haben, in denen wir TINYINT (1) verwenden, um tatsächlich einen booleschen Wert darzustellen. Und ich bin derzeit nicht in der Lage, die Spaltentypen in MySQL zu ändern.

Wie kann ich erzwingen, dass Rails 4.1 den Typisierungsschritt überspringt und stattdessen direkt in die Datenbank schreibt?

(Dieser Auszug aus der Rails 4.1-Quelle kann von Nutzen sein: Ссылка )

    
Ben Visness 23.06.2015, 20:26
quelle

4 Antworten

2

Können Sie Raw SQL verwenden, um die Einfügung durchzuführen?

Etwas wie:

%Vor%     
user1002119 26.06.2015, 23:59
quelle
1

Ich weiß nicht, ob es funktioniert, aber Sie können versuchen, den Setter mit der Methode zu überschreiben: raw_write_attribute oder: write_attribute. Die Methoden: raw_write_attribute und: write_attribute deaktivieren / aktivieren den Typ Casting vor dem Schreiben .

Nehmen wir an, das Attribut / die Spalte heißt: the_boolean_column_who_wanted_to_be_an_integer. Sie können wahrscheinlich Folgendes tun:

%Vor%

Funktioniert es?

    
d34n5 25.06.2015 21:43
quelle
0

Vielleicht sollten Sie den Setter vollständig überschreiben, indem Sie verwenden Schienen 4.1 Quellcode :

%Vor%

Beachten Sie, dass @attributes[attr_name] = send(type_cast_method, column, value) in @attributes[attr_name] = value geändert wurde. Sie können es wahrscheinlich für Ihren Anwendungsfall vereinfachen. Beachten Sie auch, dass ich dies nicht versucht habe, und selbst wenn es funktioniert, sollten Sie vorsichtig sein, wann immer Sie Schienen aktualisieren möchten.

    
AOG 26.06.2015 00:35
quelle
0

Plan A: Wechsel zu SMALLINT (2 Bytes) als Kompromiss.

Plan B: Sehen Sie, ob TINYINT(3) Rails dazu bringt, nicht zu denken, dass es Boolesch ist.

Plan C: Sehen Sie, ob TINYINT UNSIGNED Rails dazu bringt, nicht zu denken, dass es Boolean ist. (Dies setzt voraus, dass Ihre Nummer nicht negativ ist: 0..255.)

    
Rick James 26.06.2015 22:58
quelle