使用Module#prepend查询str_enum

我有一个 Rails 模型,它使用str_enum gem。

我正在构建一个生成器,它读取模型并为它们创建页面,因此我希望能够了解str_enum附加到模型的内容。

例如

class User < ApplicationRecord
  str_enum :email_frequency, %i[every daily weekly], default: 'every'
end

理想情况下,我希望能够查询User模型并了解str_enum附加到email_frequency,其值为every, daily& weekly

一旦我能理解str_enum给定字段附加了一个,我就可以将该字段复数化并获取值:

irb(main):004:0> User.email_frequencies
=> ["every", "daily", "weekly"]

这里也有人问过这个问题,建议使用Module#prepend. 我熟悉prepend有条件地将方法插入模型中。

我该如何使用它来解决这个问题?

编辑

这对于验证非常简单,例如:从模型中获取验证

回答

如果我正确理解您的问题是您想要获取所有附加有枚举字符串的列。如果是这样,您可以像这样覆盖 gem 方法

# lib/extenstions/str_enum.rb

module Extensions
  module StrEnum
    module ClassMethods
      def str_enum(column, *args)
        self.str_enums << column.to_s.pluralize
        super
      end
    end

    def self.prepended(base)
      class << base
        mattr_accessor :str_enums
        self.str_enums = []
        prepend ClassMethods
      end
    end
  end
end

在用户模型中

prepend Extensions::StrEnum

现在你可以使用

User.str_enums

列出所有附加了 str 枚举的列。

确保您已将lib目录添加到加载路径中。


以上是使用Module#prepend查询str_enum的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>