rails_admin: Add support for Postgres ranges - "Daterange data type not supported"

I’m on Rails 4.0 which has support for Postgres range data types.

PostgreSQL ranges type support. Includes: int4range, int8range, numrange, tsrange, tstzrange, daterange

Rails Admin unfortunatelly doesn’t support it:

RuntimeError in RailsAdmin::Main#new …/gems/rails_admin-> 0.5.0/app/views/rails_admin/main/_form_filtering_multiselect.html.haml where line #20 raised:

Unsupported field datatype: daterange Extracted source (around line #20):

     collection = if xhr
        selected.map { |o| [o.send(field.associated_object_label_method), o.send(field.associated_primary_key)] }
      else
        i = 0
        #line below that raised exception
        controller.list_entries(config, :index, field.associated_collection_scope, false).map { |o| [o.send(field.associated_object_label_method), o.send(field.associated_primary_key)] }.sort_by {|a| [selected_ids.index(a[1]) || selected_ids.size, i+=1] }

Would be cool if Rails Admin also supported it, if not than maybe we should think of ‘Doesn’t support these features’ section in main readme?

About this issue

  • Original URL
  • State: open
  • Created 11 years ago
  • Reactions: 1
  • Comments: 16

Most upvoted comments

Something like this should work:

class RailsAdmin::Config::Fields::Types::Int4range < RailsAdmin::Config::Fields::Base
  RailsAdmin::Config::Fields::Types.register(self)

  SEPARATOR = "-".freeze

  def generic_help
    'Use "-" as a separator'
  end

  register_instance_option :formatted_value do
    if value.present?
      "#{value.min}-#{value.max}".html_safe
    end
  end

  def parse_input(params)
    input_value = params[name]

    if input_value.blank?
      params[name] = nil
      return
    end

    data = input_value.split(SEPARATOR).map(&:strip).map(&:to_i)
    if data.size != 2
      params[name] = nil
      return
    end

    params[name] = Range.new(*data)
  end
end

Try adding this to RailsAdmin initialiser,

 class RailsAdmin::Config::Fields::Types::Daterange < RailsAdmin::Config::Fields::Base
   RailsAdmin::Config::Fields::Types::register(self)
end