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?
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. –