首页 > 解决方案 > Rails 将布尔值 1 解释为 false

问题描述

我有一个烦人的问题:我想将用户标记为已删除,因此我创建了一个名为“已删除”的布尔数据库列并将用户标记为已删除。现在,当我搜索它时:

ds = User.where(deleted: 1)
User Load (0.8ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted` = 1 LIMIT 11
=> #<ActiveRecord::Relation [#<
   User id: 4, 
   vname: "Max", 
   nname: "Muster", 
   ...
   emailverified: true,
   deleted: false>]>

为什么 Rails 将 1 解释为 false?一个应该是真的,如以下搜索所示:

ds = User.where(deleted: true)
User Load (0.8ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted` = 1 LIMIT 11
=> #<ActiveRecord::Relation [#<
   User id: 4, 
   vname: "Max", 
   nname: "Muster", 
   ...
   emailverified: true,
   deleted: false>]>

所以我搜索 deleted = true 并得到一条记录,其中 deleted = false ???

我需要这个来进行我正在编写的测试:

expect(user_after_deletion.deleted).to be true

但 user.deleted 始终为 false,即使 1 存储在数据库中。

使用“emailverified”字段,一切都按预期工作。这些列都是 tinyint(1)。

我试图重命名该列,但仍然没有运气。

谁能指出我正确的方向?谢谢!

PS:用户.rb

class User < ApplicationRecord

  attr_accessor :passwd_upd
  belongs_to :entitlement

  after_initialize :set_uid
  has_secure_password

  has_many :user_histories

 def self.automatic_deletion
    User.where("created_at > ?", (Time.now - 24.hours)).each do |u|
      u.deleted = true
      u.save(validate: false)
    end
  end

  def undelete
    self.deleted = false
  end
end

以及相应的迁移。

class AddDeletedToUsers < ActiveRecord::Migration[5.1]
  def change
    add_column :users, :deleted, :boolean
  end
end

标签: ruby-on-railsboolean

解决方案


我通过将 Rails 从 5.1.4 更新到 5.2 来“解决”它。

现在我得到:

ds = User.where(deleted: true)
User Load (0.8ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted` = 1 LIMIT 11
=> #<ActiveRecord::Relation [#<
   User id: 4, 
   vname: "Max", 
   nname: "Muster", 
   ...
   emailverified: true,
   deleted: true>]>

很抱歉偷走了你的时间。


推荐阅读