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場(布爾),我希望能在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 } 

導致以下整合檢索錯誤消息:

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

即相同PROC在控制檯返回[true, false]

任何建議都會非常受歡迎。謝謝!

回答

2

從meta_search寶石頁面,您可以看到,對於布爾值「何在」是:

  • 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和更新---

現在主動系統管理員使用單獨的模塊爲每個:在過濾器的=> ...選項。 因此,例如,你可以把下面的代碼初始化文件

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 2012-01-27 14:06:33

+0

謝謝!這對我很好! – 2012-07-12 19:18:15