20

「map_id」という整数列を持つテーブルがあります。この列が NULL であるか、または NULL でないかをフィルターするために、activeadmin フィルターを追加したいと考えています。

これはどのように実装できますか?

次のフィルターを試しました

filter :map_id, :label => 'Assigned', :as => :select, :collection => {:true => nil, :false => ''}

しかし、次のエラー メッセージが表示されます。

未定義のメソッド「map_eq」 #

4

5 に答える 5

34

遅ればせながらこのスレッドで誰かが起こっている場合は、アクティブな admin で null または非 null をフィルタリングする簡単な方法があります。

filter :attribute_present, :as => :boolean 
filter :attribute_blank,   :as => :boolean  

これを実現するためにスコープにカスタム メソッドを追加する必要はなくなりました。

于 2015-01-05T11:38:53.370 に答える
15

良い解決策は見つかりませんでしたが、ここに方法があります。Active_adminのフィルターはmeta_searchによって実行されます。モデル内のmeta_searchによって自動的に生成された関数をオーバーライドして、目的の動作を取得できます。他のクエリとチェーンするためにリレーションを返す必要があるため、スコープを使用するのが最善の方法です。 / scopes、ここで述べられているように

モデル内:

:as =>:selectフィルターの場合、acitve_adminは_eqを使用します。ここで、ソースコードは次のとおりです。

scope :map_eq, 
        lambda{ |id|
        if(id !='none')
            where( :map_id=> id)
        else
            where( :map_id=> nil)
        end
        }

#re-define the search method:
search_method :map_eq, :type => :integer

ative_adminレジスタブロック内:

filter :map_id, :label => 'Assigned', :as => :select, :collection => [['none', 'none'], ['one', 1],['tow', 2]]

# not using :none=>nil because active_admin will igore your nil value so your self-defined scope will never get chained.

この助けを願っています。

于 2012-08-27T06:15:45.303 に答える
1

ActiveAdmin の新しいバージョンは Ransacker を使用します。私はそれをこのように機能させることができました:

管理者について

filter :non_nil_map_id, :label => 'Assigned', :as => :select, :collection => [['none', 'none'], ['one', 1],['tow', 2]]

一貫性を保つために、フィルター名を変更するだけで @Gret answer から同じコードを取得しました

あなたのモデルで

ransacker :not_nil_map_id, :formatter => proc {|id|  map_id != 'none' ? id : 'none' } do |parent|
    parent.table[:id]
end

これにより、id が「none」の場合にnilに対する検索がトリガーされ、アクティブなレコードはすべてのnil idエントリを返します。

このスレッドは大いに役立ちました。

于 2014-03-10T17:44:24.710 に答える