Рельсовый движок — регистрация типа активной записи

#ruby-on-rails #ruby #rails-engines

Вопрос:

В стандартном приложении Rails легко зарегистрировать пользовательский тип записи ActiveRecord:

Например config/initializers/duration_type.rb :

 class DurationType < ActiveRecord::Type::String
  def cast(value)
    return value if value.blank? || value.is_a?(ActiveSupport::Duration)

    ActiveSupport::Duration.parse(value)
  end

  def serialize(duration)
    duration ? duration.iso8601 : nil
  end
end

ActiveRecord::Type.register(:duration, DurationType)
 

Как добиться того же в двигателе rails?

Комментарии:

1. Я бы сказал, что это должно быть очень похоже? Определите тип, запросите его в railtie и определите инициализатор в вашем railtie, чтобы зарегистрировать его.

Ответ №1:

Я бы предположил, что что-то подобное сработало бы даже без Рейли:

 # my_gem/lib/my_gem/duration_type.rb
class MyGem::DurationType < ActiveRecord::Type::String
  def cast(value)
    return value if value.blank? || value.is_a?(ActiveSupport::Duration)

    ActiveSupport::Duration.parse(value)
  end

  def serialize(duration)
    duration ? duration.iso8601 : nil
  end
end

ActiveSupport.on_load(:active_record) do
  ActiveRecord::Type.register :duration, MyGem::DurationType
end