简化 Rails 中的时间戳切换
发布: (2026年2月25日 GMT+8 01:15)
2 分钟阅读
原文: Dev.to
Source: Dev.to
概览
我经常使用时间戳(例如 completed_at)来充当布尔标记。它比真正的布尔值提供了更多(元)数据,但在 UI 上通常希望显示一个复选框,让用户切换,而不是显示日期时间字段。
实现
一个简单的 Concern 提供了如下 API:
@resource.completed?
@resource.complete!
@resource.complete=
然后你可以在表单中使用 form.check_box :completed。
布尔属性 Concern
# lib/boolean_attributes.rb
module BooleanAttribute
extend ActiveSupport::Concern
class_methods do
def boolean_attribute(*fields)
fields.each do |field|
column = :"#{field}_at"
define_method(field) { public_send(column).present? }
define_method("#{field}?") { public_send(column).present? }
define_method("#{field}=") do |value|
public_send(
"#{column}=",
ActiveModel::Type::Boolean.new.cast(value) ? Time.current : nil
)
end
define_method("#{field}!") { update!("#{column}": Time.current) }
end
end
end
end
在模型中使用 Concern
class Task < ApplicationRecord
include BooleanAttributes
boolean_attribute :completed
# …
end
结论
正是这些小的 Concern 让你的开发生活更轻松。