【问题标题】:"IS NOT TRUE" with Rails 3 query or meta_where“不正确”与 Rails 3 查询或 meta_where
【发布时间】:2011-03-01 10:25:37
【问题描述】:

我需要的可能很简单:

Table.where('field is not true')

但我不知道这是如何使用 Rails 3 查询界面完成的,并且可能使用 meta_where。问题是虽然 ":field.not_eq => nil" 正确转换为 "IS NOT NULL",但 ":field.not_eq => true" 变成 "!= 1",这显然与 "IS NOT TRUE" 不同"(mysql 和 postgresql 扩展)。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 arel


    【解决方案1】:

    mysql 中没有布尔值,见:http://dev.mysql.com/doc/refman/5.1/en/numeric-type-overview.html

    布尔值,布尔值

    这些类型是 TINYINT(1) 的同义词。零值被认为是错误的。非零值被认为是真的:

    如您所见,布尔值始终是可转换为 1 或 0 的小整数,这就是为什么 rails 会创建“field != 1”而不是 field 不正确的原因。

    不确定postgresql是否通过。

    【讨论】:

    • 这不是关于 mysql 类型,而是关于运算符 " IS ",它肯定存在于 mysql 中:dev.mysql.com/doc/refman/5.5/en/… 否则,我很乐意接受更标准的 SQL过滤掉不正确的布尔字段的解决方案。看起来很简单。
    • 我可能误解了你一点。在 mysql 中 1true 相同 经过一些测试,我得出的结论是:field IS true 给出与 field is 1field = 1field = true 相同的结果,与 is not 运算符 @987654329 相同@、field != 1field != true。这能回答你的问题吗?
    • 您的测试可能不包含 NULL 值。 "is not true" 表示“不完全等于 true,包括 null”,而“!= 1”表示“任何不等于 1,但不为 null”。 “IS [NOT]”运算符给人一种二元逻辑的错误印象,而它实际上是三元的,而这正是我所需要的。
    • 是的,但你不是说 where(field.not_eq => nil) 正确转换为 IS NOT NULL 我可能完全误解了你,但我很高兴你找到了解决方案!
    • 解决方案?没找到,我还在澄清问题=)
    【解决方案2】:

    这将是创建 github 分支的绝佳机会 :) 它完全应该添加到 meta_where 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多