检查在 Rails 7 中新创建的记录上覆盖默认值的更改

问题描述 投票:0回答:2

对于我们的应用程序,我通过两种方式新创建记录:

  1. 使用数据库中的默认值。
  2. 手动设置属性。

我需要区分这些更改,以便知道该属性是否被手动覆盖,或者是否因为它是默认值而被设置。

我正在使用

before_validation
回调
on: :create
和检查
changes
的方法,但此方法无法区分这两种情况。当涉及
changes
方法时,这两行是相等的(我使用 Minitest 和 FactoryBot 来表达我的观点):

# Table name: users
# admin       :boolean          default(FALSE), not null

FactoryBot.create(:user, admin: false)
FactoryBot.create(:user)

有什么方法可以区分吗?

ruby-on-rails validation ruby-on-rails-7 activemodel
2个回答
0
投票

一个技巧利用了这样一个事实:如果值是默认提供的,Rails 不会使用 setter 方法。因此,您可以覆盖设置器并设置一些其他属性来指示这是由调用者设置的:

  def initialize(*)
    @default_admin = true
    super
  end

  def default_admin?; @default_admin; end

  def admin=(*)
    @default_admin = false
    super
  end

还为以下公司工作的额外优势:

u = User.new
u.admin = false

0
投票

布尔列只有 3 个可能的值:true、false 和 NULL。不可能(至少以任何有意义的方式)区分真假,您需要更多数据。

最简单的方法是使用 NULL 作为默认值。 Rails 认为 NULL 是“错误的”,因此此类用户不会获得管理员权限,但您将能够轻松辨别差异: NULL - 默认用户; FALSE - 明确的。

© www.soinside.com 2019 - 2024. All rights reserved.