How do I show unscoped models in Rails Admin?

眉间皱痕 提交于 2019-12-18 05:01:37

问题


I needed this myself, so here it is QA-style:

By default, Rails Admin shows a model's default_scope. How do I get it to show every model completely unscoped?


回答1:


Approach 1

If you only need to list the records you can use the scopes method to control which records are returned. The first array element is the default, so if you add the following to your initialiser:

list do
  scopes [:unscoped]
end

you will see all records.

Approach 2

If you want to do more than list models you can create a dummy rails admin model. For example, assuming you have a Post model with a boolean archived flag:

class Post < ActiveRecord::Base
  default_scope { archived: false }
end

You can create a dummy model to use in rails_admin like so (in app/models/rails_admin)

class RailsAdmin::Post < ActiveRecord::Base
  self.table_name = "posts"
end

You then configure rails_admin to use RailsAdmin::Post and all of the Posts will be unscoped.




回答2:


Add this monkey patch to your rails admin initializer:

### Monkey pactch for unscoped records in admin panel
require 'rails_admin/main_controller'
module RailsAdmin
  class MainController
    alias_method :old_get_collection, :get_collection
    alias_method :old_get_object, :get_object

    def get_collection(model_config, scope, pagination)
      old_get_collection(model_config, model_config.abstract_model.model.unscoped, pagination)
    end

    def get_object
      raise RailsAdmin::ObjectNotFound unless (object = @abstract_model.model.unscoped.find(params[:id]))
      @object = RailsAdmin::Adapters::ActiveRecord::AbstractObject.new(object)
    end
  end
end

Taken from https://github.com/sferik/rails_admin/issues/353.




回答3:


I have a solution similar to Charles' above but that monkey patches the model layer rather than the controller layer. This might be a bit more stable across Rails Admin releases, but is ActiveRecord-specific and doesn't affect Mongoid, though the principle would be easily applied to the other adapter.

Again, put it in the rails admin initializer.

#
# Monkey patch to remove default_scope
#
require 'rails_admin/adapters/active_record'
module RailsAdmin::Adapters::ActiveRecord
  def get(id)
    return unless object = scoped.where(primary_key => id).first
    AbstractObject.new object
  end
  def scoped
    model.unscoped
  end
end



回答4:


My monkey patch, for Mongoid:

module RailsAdminFindUnscopedPatch
  def get(id)
    RailsAdmin::Adapters::Mongoid::AbstractObject.new(model.unscoped.find(id))
  rescue
    super
  end
end

RailsAdmin::Adapters::Mongoid.prepend(RailsAdminFindUnscopedPatch)

I'm reusing original rescue clause (super call).



来源:https://stackoverflow.com/questions/20069425/how-do-i-show-unscoped-models-in-rails-admin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!