2009-05-06 9 views
9

Ich bin ein bisschen wie ein Noob noch mit Schienen, aber ich bin über etwas, das ein bisschen seltsam scheint. Ich habe ein boolean Feld auf ein Modell in der Datenbank thuslyBooleans in Schienen mit sqlite

t.column :admin, :bool, :default => false, :null => false 

Jedoch darf der Wert in der sqlite3 Datenbank entweder 't' oder 'f' zu sein scheint. Das ist in Ordnung, aber ich würde immer noch erwarten, user.admin? false zurückgeben, wenn der Wert 'f' ist. Wie Sie aus der folgenden Konsolensitzung sehen können, ist das nicht der Fall:

>> user = User.first 
=> #<User id: 2, login: "matt", name: "", email: "[email protected]", crypt 
ed_password: "c6740f820b4cbf6e3d88188719f23cd3053a54f0", salt: "5629f5ee09f51543 
a7d64dd903b8d9e53aa43a24", created_at: "2009-04-26 23:08:05", updated_at: "2009- 
04-26 23:10:38", remember_token: nil, remember_token_expires_at: nil, admin: "t" 
> 
>> user.admin? 
=> true 
>> user.admin = false 
=> false 
>> user.save 
=> true 
>> user = User.first 
=> #<User id: 2, login: "matt", name: "", email: "[email protected]", crypt 
ed_password: "c6740f820b4cbf6e3d88188719f23cd3053a54f0", salt: "5629f5ee09f51543 
a7d64dd903b8d9e53aa43a24", created_at: "2009-04-26 23:08:05", updated_at: "2009- 
05-06 03:32:23", remember_token: nil, remember_token_expires_at: nil, admin: "f" 
> 
>> user.admin? 
=> true 

dies mit SQLite nur einig seltsames Problem, oder bin ich einfach nicht etwas zu bekommen?

+0

Ich weiß nicht die genaue Antwort, aber ich denke, es hat wahrscheinlich mit Ruby/Rails zu tun, nicht SQLite per se. SQLite hat keinen booleschen Datentyp (siehe http://www.sqlite.org/datatype3.html), daher ist es die Aufgabe des Wrappers, diese irgendwie zu kodieren. Normalerweise würden 1 oder 0 verwendet, aber Rails könnte etwas seltsam machen. Denken Sie auch daran, dass SQLite schwach typisiert ist, so dass Sie Ints in Ihre Varchar-Spalten usw. einfügen können, was zu Schmerzen führen kann (siehe http://chriscraig.net/blog/sqlite-boolean-true-or-false/ für relevante Diskussionen)) wenn du nicht aufpasst. –

Antwort

13

Verwenden Sie stattdessen:

t.column :admin, :boolean, :default => false, :null => false 

Lesen Sie, warum here.

+0

Ja, ich dachte mir, dass es so etwas Seltsames ist. Danke :) +1 und als beantwortet markiert –

1

Das Problem kann mit der Datenbankmigration auftreten. Ich glaube nicht, dass: bool der richtige Datentyp ist, den man verwenden kann. Versuchen Sie: boolean stattdessen, z.

t.column :admin, :boolean, :default => false, :null => false