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モデルは、私はActiveAdminのCheckoutRequestインデックスページでフィルタリングできるようにしたいと思いcompletedフィールド(boolean)を持っています。私は、以下のようないくつかの異なる方法を試みました。

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

この結果、フィルタが表示されません。次のメタサーチエラーメッセージの

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]を返し、次のように、ラインに:as => :selectを追加します。

どのような提案も大歓迎です。ありがとう!あなたは「のwheres」はブール値のためにそれを見ることができますmeta_search宝石のページから

答えて

2

は以下のとおりです。

  • is_true - 本当です。 「管理者のみを表示」などのチェックボックスに便利です。
  • is_false - is_trueの補数です。

ですから、生成する入力名を 'completed_eq'から 'completed_is_true'または 'completed_is_false'に変更する必要があります。

アクティブな管理コードを見ることで、「Wheres」は各データタイプごとにハードコードされているため、これを行うことができるのはJavascriptだけです。

私は通常(jQueryのを使用して)私のactiveadmin.jsファイル内でこのような行

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

または

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

ひどいと醜いハックを持っているだろうが、他のソリューションを自分自身を発見しました。

これは、必要なページでのみ有効にしてください。 VERSION 0.4.2以降FOR

--- NEW ---

は今、アクティブな管理はそれぞれの個別のモジュールを使用しています:フィルタのように=> ...オプション。 だから例えば、あなたは初期化ファイル

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

ありがとう!これは私にとって素晴らしい作品です! –

関連する問題