Mysql 检查Rails中布尔值的正确方法

Mysql 检查Rails中布尔值的正确方法,mysql,ruby-on-rails,comparison,boolean,tinyint,Mysql,Ruby On Rails,Comparison,Boolean,Tinyint,我在尝试检查Rails中的布尔值时遇到了一些问题。之前,我的条件用于检查布尔值与1或0之间的关系,这是有效的。但最近,这已经不起作用了 当我在mysql级别检查它们时,布尔值存储为tinyint(1),值为1和0。但是当我在railsdevelopment.log中打印这些值时,它们分别显示为true和false Earlier comparison logic is_admin == 1 当我现在检查true和false而不是1和0(因为最近的问题)时,一切正常。我不知道为什么我之前没有失败

我在尝试检查Rails中的布尔值时遇到了一些问题。之前,我的条件用于检查布尔值与1或0之间的关系,这是有效的。但最近,这已经不起作用了

当我在mysql级别检查它们时,布尔值存储为tinyint(1),值为1和0。但是当我在railsdevelopment.log中打印这些值时,它们分别显示为true和false

Earlier comparison logic
is_admin == 1
当我现在检查true和false而不是1和0(因为最近的问题)时,一切正常。我不知道为什么我之前没有失败

Current comparison logic
is_admin == true
我也不是100%确信布尔列的比较应该在Rails上下文中始终与true或false进行,或者应该与1和0进行比较

有人能解释一下吗

我在这个过程中意识到的一件事是,前面的比较是1(一个整数)和true(实际的布尔值)之间的比较结果为false。这一点我现在可以理解了,但我仍然无法理解之前这种逻辑是如何对我起作用的

Current comparison logic
is_admin == true

任何见解都会对这一点有所帮助。请推荐在Rails中执行此类检查的最佳实践。谢谢。

不同的数据库以不同的方式存储布尔值。Mysql将它们存储为
0
1
。rails将它们转换为
false
true
。通常,在ruby代码中将它们视为布尔值

此代码

if is_admin == true
这是多余的。你不妨说

if is_admin

因为无论哪种方式,结果都是一样的

正如@Max Williams所述,不同的数据库以不同的方式存储布尔值

MySQL将它们存储为
0
1
。因此调用
is_admin==true
将返回true,调用
is_admin==false
将返回false

当涉及到
PostgreSQL
,它有很多方法

对于
true
,有效值为

TRUE,'t','true','y','yes'and '1'
FALSE,'f','false','n','no' and '0'
对于
false
,有效值为

TRUE,'t','true','y','yes'and '1'
FALSE,'f','false','n','no' and '0'

注意:我刚刚比较了布尔值在
MySQL
PostgreSQL
中的存储方式,这样可以消除您的困惑。我希望这肯定会对您有所帮助。

如果您使用的是MySQL,诀窍是添加一个问号(?):


您是否更改了rails的版本?对于MySQL,在数据库级别,布尔值始终存储为
0
1
。因此调用
is_admin==true
is_admin==1
将返回
true
@Babar,不,rails的版本保持不变。问题是,当我使用与
is_admin==1
的比较时,它提前通过了,但不再通过。这时,我将其替换为
is_admin==true
。但是它工作得更早,而现在不工作,这让我很困惑,因此问题是什么才是最安全的正确方法。@boddhisattva似乎很奇怪!我不知道是什么原因造成的。但我建议你使用
is_admin==true
,因为它看起来像是对布尔值的合理调用。我认为可能是这种情况的一个原因(如问题中所述)是。。当我查看日志时。。我认为在这种情况下,它试图将布尔值(即真或假)与整数(1)进行比较。。因此,如果true==1,它将计算
,如果false…@boddhisattva-Hmm,它可能与布尔数据类型的整数值混淆了。可能是这样,但我真的不明白为什么它在早期工作。那时候就应该失败了。谢谢你的回答,我明白你的意思。所以你是说如果我想检查if
is_admin==true
我可以简单地使用
if is_admin
,如果我想检查false,我可以使用if
!你是管理员吗?是的。另外,在Ruby中,任何东西都可以放入“if”测试,并将评估为“truthy”(通过测试)或“false”(未通过测试)。唯一“错误”的对象是
nil
false
。其他一切,包括空字符串、空数组、数字0等,都被认为是“真实的”。此外,未定义的局部变量(
foo
-注意缺少@)如果被引用,将导致异常,但未定义的实例变量(
@foo
)将被视为nil。这意味着你可以做“如果@foo”,如果@foo是错误的或没有定义,这将失败。我还没有找到解决我所面临问题的方法(可能是我需要更深入地挖掘,我目前无法做到这一点,但你的回答肯定回答了标题中的问题,因此接受了它。冗余的有效点。