How do I show unscoped models in Rails Admin?

后端 未结 4 1046
礼貌的吻别
礼貌的吻别 2020-12-18 04:45

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?

相关标签:
4条回答
  • 2020-12-18 04:54

    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.

    0 讨论(0)
  • 2020-12-18 04:57

    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
    
    0 讨论(0)
  • 2020-12-18 04:59

    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.

    0 讨论(0)
  • 2020-12-18 05:06

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

    0 讨论(0)
提交回复
热议问题