带有 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)。
AA 示例(使用提交 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
有没有人知道如何将 ActiveResource 与 RailsAdmin 或 ActiveAdmin 或其他类似引擎一起使用。
看起来这两个项目还没有此功能 (https://github.com/activeadmin/activeadmin/issues/26, https://github.com/sferik/rails_admin/issues/1355)。另一方面,这是相当常见的情况,当您的数据驻留在其他 service/app(相对于数据库)时,我想知道是否有人将其一起入侵。
我尝试围绕 ActiveResource 资源创建 ActiveRecord 包装器。但是,这超出了我对 ActiveRecord 的了解(可能 Ruby)。
AA 示例(使用提交 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