2

Rails 3.1, ActiveAdmin 0.3.4.ActiveAdmin, полиморфные ассоциации и настраиваемые фильтры

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

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] в консоли.

Любые предложения были бы весьма желанными. Благодаря!

ответ

2

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

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

так что вам нужно изменить имя ввода сгенерированного файла из 'completed_eq', чтобы быть 'completed_is_true' или 'completed_is_false'.

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

я обычно есть строка, как это в моем файле activeadmin.js (используя JQuery)

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

или

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

Страшная и уродливая хак, но не нашел никакого другого решения сам.

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

--- NEW ДЛЯ ВЕРСИИ 0.4.2 и новее ---

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

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 

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

+0

Спасибо за ответ! Я посмотрю и посмотрю, работает ли это для меня. Если это произойдет, я буду отмечать это как правильный ответ. – justinbach

+0

Спасибо! Это отлично работает для меня! –

 Смежные вопросы

  • Нет связанных вопросов^_^