Search code examples
ruby-on-railsrubyrails-engines

Rails engine - registering an ActiveRecord type


In the standard Rails application it is easy to register custom ActiveRecord type:

For example 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)

How to achieve the same in the rails engine?


Solution

  • I'd imagine something like that would work even without railtie:

    # 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