带有 RailsAdmin 或 ActiveAdmin 的 ActiveResource

ActiveResource with RailsAdmin or ActiveAdmin

有没有人知道如何将 ActiveResource 与 RailsAdmin 或 ActiveAdmin 或其他类似引擎一起使用。

看起来这两个项目还没有此功能 (https://github.com/activeadmin/activeadmin/issues/26, https://github.com/sferik/rails_admin/issues/1355)。另一方面,这是相当常见的情况,当您的数据驻留在其他 service/app(相对于数据库)时,我想知道是否有人将其一起入侵。

我尝试围绕 ActiveResource 资源创建 ActiveRecord 包装器。但是,这超出了我对 ActiveRecord 的了解(可能 Ruby)。

A​​A 示例(使用提交 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

型号

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

补丁

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