ActiveAdmin, полиморфные ассоциации и пользовательские фильтры - PullRequest
2 голосов
/ 17 января 2012

Rails 3.1, ActiveAdmin 0.3.4.

Мой вопрос чем-то похож на этот , но достаточно отличается с точки зрения моделирования данных, и я думаю, что он требует своего собственного ответа. Модели:

class CheckoutRequest < ActiveRecord::Base  
  has_one :request_common_data, :as => :requestable, :dependent => :destroy
end

class RequestCommonData < ActiveRecord::Base
  belongs_to :requestable, :polymorphic => true
end

Модель RequestCommonData имеет поле completed (логическое значение), которое я хотел бы отфильтровать на индексной странице CheckoutRequest ActiveAdmin. Я пробовал несколько разных подходов, но безрезультатно:

filter :completed, :collection => proc { CheckoutRequest.all.map { |cr| cr.request_common_data.completed }.uniq }

, в результате чего фильтр не отображается. Добавляем :as => :select к строке следующим образом:

filter :completed, :as => :select, :collection => proc { CheckoutRequest.all.map { |cr| cr.request_common_data.completed }.uniq }

приводит к следующему сообщению об ошибке MetaSearch:

undefined method `completed_eq' for #<MetaSearch::Searches::CheckoutRequest:0x007fa4d8faa558>

Тот же процесс возвращает [true, false] в консоли.

Любые предложения приветствуются. Спасибо!

1 Ответ

2 голосов
/ 21 января 2012

На странице гема meta_search вы можете видеть, что для логических значений 'Wheres':

  • is_true - это правда. Полезно для флажка типа «показывать только администраторов».
  • is_false - дополнение is_true.

так что вам нужно изменить имя сгенерированного входа с 'complete_eq', чтобы оно было 'завершено_is_true' или 'завершено_is_false'.

Единственный способ, которым я нашел это, можно сделать с помощью Javascript, поскольку при просмотре кода Active Admin «Wheres» жестко кодируются для каждого типа данных.

Обычно в моем файле activeadmin.js (с использованием jQuery) есть такая строка *

$('#q_completed_eq').attr('name', 'q[completed_is_true]');

или

$('#q_completed_eq').attr('name', 'q[completed_is_false]');

Ужасный и безобразный хак, но я не нашел другого решения.

Будьте внимательны, чтобы включить это только на тех страницах, которые вам нужны.

--- НОВИНКА ДЛЯ ВЕРСИИ 0.4.2 и новее ---

Теперь Active Admin использует отдельные модули для каждого параметра: as => ... в фильтрах. Например, вы можете поместить приведенный ниже код в файл инициализатора

module ActiveAdmin
  module Inputs
    class FilterCustomBooleanInput < ::Formtastic::Inputs::SelectInput
      include FilterBase

      def input_name
        "#{@method}_is_true"
      end

      def input_options
        super.merge(:include_blank => I18n.t('active_admin.any'))
      end

      def method
        super.to_s.sub(/_id$/,'').to_sym
      end

      def extra_input_html_options
        {}
      end
    end
  end
end

и использование

:as => :custom_boolean

где вы указываете свой фильтр.

...