Как мне показать модели с незаданной областью в 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
У меня есть решение, подобное Чарльзу выше, но эта обезьяна исправляет уровень модели, а не уровень контроллера. Это может быть немного более стабильным в версиях 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
вызов).