简化 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 让你的开发生活更轻松。

原文发表于 Rails Designer’s Build a SaaS Blog

0 浏览
Back to Blog

相关文章

阅读更多 »

停止在 Rails 中错误使用 .any?

介绍:传递给 .any? 的单个块可能会在不发出警告或错误的情况下,悄悄将成千上万条记录加载到内存中——仅仅是产生不必要的对象。大多数 Rails 开发者……

理解 importmap-rails

介绍 如果你使用过现代 JavaScript,你会熟悉 ES 模块和 import 语句。Rails 应用可以使用 esbuild、vite 或 bun 来实现这些功能……