ActiveAdmin,多态关联和自定义筛选器

时间:2012-01-17 17:37:02

标签: ruby-on-rails ruby-on-rails-3.1 polymorphic-associations activeadmin

Rails 3.1,ActiveAdmin 0.3.4。

我的问题有点类似于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字段(布尔值),我希望能够在ActiveAdmin的CheckoutRequest索引页面中进行过滤。我试过几种不同的方法无济于事,包括以下内容:

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>

同一个proc在控制台中返回[true, false]

任何建议都会非常受欢迎。谢谢!

1 个答案:

答案 0 :(得分:2)

在meta_search gem页面中,您可以看到,对于布尔值,'Wheres'是:

  • is_true - 是的。对于“仅显示管理员用户”等复选框很有用。
  • is_false - is_true的补充。

所以你需要的是将生成输入名称从'completed_eq'更改为'completed_is_true'或'completed_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 =&gt; ...过滤器中的选项。 例如,您可以将下面的代码放在初始化文件

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

指定过滤器。