Как мне показать модели с незаданной областью в Rails Admin?

Я сам нуждался в этом, так что вот это стиль QA:

По умолчанию Rails Admin показывает модель default_scope. Как мне сделать так, чтобы каждая модель была полностью незакрытой?

4 ответа

Решение

Подход 1

Если вам нужно только перечислить записи, вы можете использовать метод областей, чтобы контролировать, какие записи возвращаются. Первый элемент массива является значением по умолчанию, поэтому, если вы добавите в инициализатор следующее:

list do
  scopes [:unscoped]
end

Вы увидите все записи.

Подход 2

Если вы хотите сделать больше, чем просто перечислить модели, вы можете создать модель администратора для фиктивных рельсов. Например, если у вас есть модель Post с логическим архивным флагом:

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

Вы можете создать фиктивную модель для использования в rails_admin следующим образом (в app/models/rails_admin)

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

Затем вы настраиваете rails_admin для использования RailsAdmin::Post, и все сообщения будут с незаданной областью.

Добавьте этот патч обезьяны в инициализатор админки rails:

### 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

Взято с https://github.com/sferik/rails_admin/issues/353.

У меня есть решение, подобное Чарльзу выше, но эта обезьяна исправляет уровень модели, а не уровень контроллера. Это может быть немного более стабильным в версиях Rails Admin, но зависит от ActiveRecord и не влияет на Mongoid, хотя этот принцип будет легко применяться к другому адаптеру.

Опять же, поместите его в инициализатор админки рельсов.

#
# 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

Мой патч обезьяны, для Mongoid:

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

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

Я повторно использую оригинальную статью о спасении (super вызов).

Другие вопросы по тегам