Rails интерпретирует логическое 1 как ложное - PullRequest
0 голосов
/ 30 мая 2018

У меня раздражающая проблема: я хочу пометить пользователей как удаленных, поэтому я создал логический столбец БД с именем «удаленный» и пометил пользователя как удаленного.Теперь, когда я ищу его:

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 как ложное?Один должен быть верным, как показывает следующий поиск:

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>]>

Поэтому я ищу удаленный = true и получаю запись, где удалено = false ???

Мне это нужно длятест, который я пишу:

expect(user_after_deletion.deleted).to be true

Но user.deleted всегда ложен, даже когда 1 хранится в БД.

С полем «emailverified» все работает как положено.Обе колонки имеют тип tinyint (1).

Я пытался переименовать колонку, но все же не повезло.

Может кто-нибудь указать мне правильное направление?Спасибо!

PS: user.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

1 Ответ

0 голосов
/ 30 мая 2018

Я «решил» это, обновив 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>]>

Извините за кражу Вашего времени.

...