使用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目录添加到加载路径中。