我有一个具有布尔属性的用户模型: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
这里发生了什么?
答案 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)