2009-05-06 8 views
9

Tôi là một chút của một noob vẫn còn với đường ray, nhưng tôi đang chạy trên một cái gì đó mà có vẻ hơi kỳ quặc. Tôi đã thêm một lĩnh vực boolean để một mô hình trong cơ sở dữ liệu thuslybooleans trong đường ray với sqlite

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

Tuy nhiên, giá trị trong cơ sở dữ liệu sqlite3 có vẻ là một trong hai 't' hoặc 'f'. Điều đó là tốt, nhưng tôi vẫn mong đợi user.admin? để trả về false nếu giá trị là 'f'. Như bạn có thể thấy từ phiên giao diện điều khiển sau, đó không phải là trường hợp:

>> 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 

Đây có phải là vấn đề lạ với sqlite hoặc tôi không nhận được gì đó không?

+0

Tôi không biết câu trả lời chính xác, nhưng tôi nghĩ nó có thể liên quan đến Ruby/Rails, chứ không phải SQLite. SQLite không thực sự có một kiểu dữ liệu boolean (xem http://www.sqlite.org/datatype3.html), do đó, nó là trách nhiệm của trình bao bọc để mã hóa nó bằng cách nào đó. Thông thường, 1 hoặc 0 sẽ được sử dụng, nhưng Rails có thể làm điều gì đó kỳ lạ. Ngoài ra, hãy nhớ rằng SQLite là gõ nhẹ để bạn có thể đặt ints trong cột VARCHAR của bạn, vv và điều này có thể gây đau (xem http://chriscraig.net/blog/sqlite-boolean-true-or-false/ cho thảo luận có liên quan) nếu bạn không cẩn thận. –

Trả lời

13

Sử dụng này để thay thế:

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

đọc tại sao here.

+0

vâng, tôi đoán nó là một cái gì đó kỳ lạ như thế. Cảm ơn :) +1 và được đánh dấu là đã trả lời –

1

Sự cố có thể xảy ra với quá trình di chuyển cơ sở dữ liệu. Tôi không nghĩ rằng: bool là tên kiểu dữ liệu thích hợp để sử dụng. Hãy thử: boolean thay thế, ví dụ:

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