Это очень похоже на ответ jvillian и ответ truongnm .
Я обычно пишу маленькие методы DSL для добавления повторяющихся методов, что-то вроде этого:
module DateFormatter
DEFAULT_FORMAT = '%Y/%m/%d %H:%M:%S'
def add_formatter(attribute, format: DEFAULT_FORMAT)
define_method("#{attribute}_datetime") do
public_send(attribute)&.strftime(format)
end
end
end
add_formatter
- это метод класса, который определяет метод экземпляра на основе заданных аргументов. Наличие format
в качестве необязательного аргумента является лишь примером.
Как метод класса, add_format
может быть вызван прямо внутри тела класса следующим образом:
module UserDecorator
extend DateFormatter
add_formatter :created_at
add_formatter :confirmed_at, format: '%A %-d, %Y'
add_formatter :locked_at
add_formatter :current_sign_in_at
add_formatter :last_sign_in_at
end
В модуле UserDecorator
появляется новый метод:
UserDecorator.instance_methods
#=> [
# :confirmed_at_datetime,
# :locked_at_datetime,
# :current_sign_in_at_datetime,
# :last_sign_in_at_datetime,
# :created_at_datetime
# ]
Их можно называть как обычно:
class TestUser
include UserDecorator
def created_at
Time.new(2019, 7, 2, 11, 53)
end
def confirmed_at
Time.new(2019, 7, 2, 11, 53)
end
end
u = TestUser.new
u.created_at_datetime
#=> "2019/07/02 11:53:00"
u.confirmed_at_datetime
#=> "Tuesday 2, 2019"
Поскольку вы используете Rails, вы можете включить его ActiveSupport::Concern
шаблон.