对于我们的应用程序,我通过两种方式新创建记录:
我需要区分这些更改,以便知道该属性是否被手动覆盖,或者是否因为它是默认值而被设置。
我正在使用
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)
有什么方法可以区分吗?
一个技巧利用了这样一个事实:如果值是默认提供的,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
布尔列只有 3 个可能的值:true、false 和 NULL。不可能(至少以任何有意义的方式)区分真假,您需要更多数据。
最简单的方法是使用 NULL 作为默认值。 Rails 认为 NULL 是“错误的”,因此此类用户不会获得管理员权限,但您将能够轻松辨别差异: NULL - 默认用户; FALSE - 明确的。