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).
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