Search code examples
ruby-on-railsactiverecordactiveadminrails-adminactiveresource

ActiveResource with RailsAdmin or ActiveAdmin


Has anybody figured out how to use ActiveResource with RailsAdmin or ActiveAdmin or with other similar engine.

It looks like both projects doesn't have this feature yet (https://github.com/activeadmin/activeadmin/issues/26, https://github.com/sferik/rails_admin/issues/1355). On other hand, it's reasonably common case, when you have data residing in other service/app (vs in DB) and I wonder whether somebody hacked it together.

I tried to create ActiveRecord wrapper around ActiveResource resource. However, it's beyond my knowledge of ActiveRecord (and Ruby probably).


Solution

  • Example with AA (tested with commit 802dc451f3b3bd84e736b512d554867c0f2ae011)

    ActiveAdmin.register Payment do
    
      actions :index
      config.batch_actions = false
      filter :created_at_gteq, as: :date_time_picker
    
      controller do  
    
        def find_collection
          @search = OpenStruct.new(params[:q] || {})
          result = Payment.find(:all, params: {
                    order: params.fetch(:order, 'created_at_desc'),
                    page: params.fetch(:page, 1),
                    per_page: params.fetch(:per_page, 50),
                    q: params[:q] || {}
                  })
          #this uses https://github.com/Fivell/activeresource-response,
          # but can be replaced with other  ActiveResource pagination implementation
          limit = result.http_response['X-Limit-Value'].to_i
          offset = result.http_response['X-Offset-Value'].to_i
          total = result.http_response['X-Total-Count'].to_i
          Kaminari.paginate_array(result, limit: limit, offset: offset, total_count: total)
        end
      end    
    end
    

    Model

    class Payment <  MyActiveResource
    
      schema do
        attribute 'customer_id', :integer
        attribute 'amount', :integer
        attribute 'created_at', :string
        attribute 'success', :boolean
      end
    
      def self.column_names
        content_columns
      end
    
      def self.content_columns
        if @content_columns.nil?
          @content_columns = Array.new
          known_attributes.each do |name|
            @content_columns << ResourceColumn.new(name)
          end
        end
        @content_columns
      end
    
      def self.columns
        content_columns
      end
    
      class ResourceColumn
        attr_reader :name
    
        def initialize(name)
          @name = name
        end
    
        def type
          :string
        end
      end
    
    end
    

    Patches

    module ActiveAdmin
      module Filters
        module FormtasticAddons
          alias :old_seems_searchable? :seems_searchable?
          def seems_searchable?
            return false if ransacker?
            old_seems_searchable?
          end
    
          def klass
            @object.try(:object).try(:klass)
          end
    
          def ransacker?
            klass.try(:_ransackers).try(:key?, method.to_s)
          end
    
          def scope?
            context = Ransack::Context.for klass rescue nil
            context.respond_to?(:ransackable_scope?) && context.ransackable_scope?(method.to_s, klass)
          end
        end
      end
    end
    
    module ActiveAdmin
      module Helpers
        module Collection
    
          def collection_size(c = collection)
            if c.is_a? ActiveRecord::Relation
              c = c.except :select, :order
              c.group_values.present? ? c.count.count : c.count
            else
              c.respond_to?(:count) ? c.count : 0
            end
          end
    
        end
      end
    end