一些數據庫支持boolean類型,而另一些則不支持,這使得Active Record要抽象boolean類型變得困難。例如,如果數據庫不支持boolean類型,有的開發者使用char(1)來替代,而內容使用“t”和“f”來表示true和false,而另外一些開發者使用integer類型,0是false,1是true。即使數據庫支持boolean類型,在內部也許還是使用0和1來存儲。
在Ruby裡,在條件判斷中,數字0和字符f都被認為是true值,這就意味著如果你直接使用屬性的值,你的代碼會被認為該列的值是true,而不是你認為的false,例如:
# 不要這樣使用
user = Users.find_by_name("Dave") if user.superuser grant_privileges end
當在查詢條件中使用屬性時,你必須在列名後添加一個問號:
# 這樣是正確的
user = Users.find_by_name("Dave") if user.superuser? grant_privileges end
當使用訪問操作符來獲取屬性的值時,當值為數字0,或者字符“0”,“f”,“false”,或“”(空字符串),或nil,或一個常量false時,都被認為是false,否則,就會被認為是true。
如果你在一個遺留系統上或者非英語系統上開發,上面對true的定義也許會無法工作,在這種情況下,你可以override內建的謂詞方法的定義,例如,荷蘭語情況下,字段也許包含J或者N,這種情況下,你可以像下面這樣:
class User < ActiveRecord::Base def superuser? self.superuser == 'J' end # . . . end