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]
。
任何建议都会非常受欢迎。谢谢!
答案 0 :(得分:2)
在meta_search gem页面中,您可以看到,对于布尔值,'Wheres'是:
所以你需要的是将生成输入名称从'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
指定过滤器。