当请求布尔值设置为false的所有记录时,Rails where子句返回nil

时间:2014-06-21 17:14:37

标签: ruby-on-rails activerecord

我有一个具有布尔属性的用户模型:sourced

我想编写下面的代码,但是我返回一个空数组

User.where(sourced: false)
#   User Load (2.0ms)  SELECT "users".* FROM "users" WHERE "users"."sourced" = 'f' ORDER BY  users.id DESC
# => [] 

然而,事实并非如此,因为实际上有些记录的源设置为false。

即我跑的时候

  User.first.sourced #=> false 

在我的schema.rb文件中,它显示了' sourced'的默认值。列是假的

  create_table "users", force: true do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "password_digest"
    t.string   "remember_token"
    t.boolean  "admin",                              default: false
    t.string   "password_reset_token"
    t.datetime "password_reset_sent_at"
    t.text     "admin_note",             limit: 800
    t.integer  "applications_count"
    t.string   "admin_link"
    t.boolean  "sourced",                            default: false
    t.boolean  "told_admin"
  end

这里发生了什么?

1 个答案:

答案 0 :(得分:1)

这是因为您在迁移过程中没有设置默认值false,因此将其保存为nil,而您并不是在寻找。用鸭子打字nil == false所以在ruby级别上它是假的。

虽然你可以对false和nil进行查询...但这有点麻烦。只需在数据库中设置默认值即可。

您可以通过迁移解决此问题

def up
  #change column
  change_column :users, :sourced, :boolean, default: false


  # reload schema https://stackoverflow.com/a/8935621/793330
  User.reset_column_information

  # update the nils 
  User.find_each(&:save) 
end 

始终记住在数据库中为布尔值设置默认值。这将为您节省大量的挫折感,并通过始终在数据库级别设置默认值来帮助验证。

此外,如果你正在使用SQLite?也许它的not typecasting properly能起作用吗?

User.where(sourced: 0)