【问题标题】:ActiveRecord Returning Different Results on Variations of Same BooleanActiveRecord 返回相同布尔变量的不同结果
【发布时间】:2018-01-29 15:49:36
【问题描述】:

我一直在尝试根据某个查询检索一定数量的用户。我遇到的问题是我的结果差异很大,具体取决于我使用的是false 还是"false"。以下是我的查询:

User.all
    .where.not(id:1)
    .where.not("lower(promo) = ?","promo")
    .where(created_at:7.months.ago..6.months.ago, auto_renew: false)

这将返回符合查询的三个用户的列表。但是当我运行以下命令时:

User.all
    .where.not(id:1)
    .where.not("lower(promo) = ?","promo")
    .where(created_at:7.months.ago..6.months.ago, auto_renew: "false")

这将返回一个不在原始列表中的用户。 auto_renew 值应该是一个布尔值。为什么返回的内容会有所不同,我该如何解决?

编辑

根据要求,这是我的 users 架构:

create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "",    null: false
    t.string   "encrypted_password",     default: "",    null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,     null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at",                             null: false
    t.datetime "updated_at",                             null: false
    t.string   "first_name"
    t.string   "last_name"
    t.boolean  "auto_renew",             default: true
  end

【问题讨论】:

  • 请向我们展示users 表的架构
  • 好的。查看编辑。
  • 我认为字符串"false" 不是false。为什么您会对不同条件的查询返回不同的结果感到惊讶?
  • 因为所有 4 个用户都应该满足一个查询或另一个。它们在两者中混杂在一起。它们都具有完全相同的值。
  • 查看您的日志或.to_sql 并找出生成的查询之间的区别。

标签: sql ruby-on-rails ruby activerecord


【解决方案1】:

false != "false"。第一个是boolean,第二个是string

在 99% 的情况下,您应该使用 false,而不是 "false"

我不确定为什么这些查询会返回不同的结果集;它可能取决于您使用的 Rails/数据库引擎/版本。如果您想查看这两个命令之间的区别,请尝试运行:

User.where(.....).to_sql

如果由于某种原因您需要以编程方式将"false" 转换为false,请参阅this answer

【讨论】:

  • (技术上falseFalseClass 的单例实例;ruby 没有布尔值。但这在我的回答中并不重要.. ..)
  • 我为每个查询运行.to_sql,不同的是,当我调用"false" 时,查询读取为'false'。当我运行刚刚调用布尔值false 的那个时,它读作'f'。无论如何,谢谢你的帮助。我会看看如何从这里开始。
  • 试图找出解决方法。是否可以查看它是否满足 false"false" 同时仍传递所有其他变量?
  • @ርollιn 你为什么要传递"false"?这对我来说听起来好像您的代码中的其他内容正在返回字符串而不是正确的数据类型。但是,如果您确实有很好 的理由需要进行字符串-->布尔转换,那么我已经为您提供了上述解决方案的链接。
  • 如果您阅读了我的问题,您会发现这是因为它们返回了两个完全不同的结果。我想知道如何合并它们。
猜你喜欢
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多