2012-09-21 62 views
10

先進的なransack検索を使用するとちょっと混乱します。私はすべてのテーブル名が検索用語として選択できず、すべての述語が使用されていないカスタム検索を行うことを試みています。私はこのためのチュートリアルとしてrailscastを使用しましたが、私は述語の数を制限する方法を見つけることができません。また、言葉遣いとテーブルフィールドの名前を別の言語(ラベルのみ)で使用する可能性はありますか?Ransack gemは述語名とカスタム述語名を選択します

マイ検索フォーム

= search_form_for @q, :url => search_offers_path, :html => { :method => :post } do |f| 
    = f.condition_fields do |c| 
    .field 
     = f.attribute_fields do |a| 
     = a.attribute_select 
     = f.predicate_select 
     = f.value_fields do |v| 
     = v.text_field :value 
     = link_to "#{t :destroy}", '#', class: "remove_fields" 

    = link_to_add_fields "#{t :add}", f, :condition 

    .field 
    = t :sort 
    = f.sort_fields do |s| 
     = s.sort_select 

    = f.submit "#{t :search}" 

私のコントローラ

def index 
    select_offers = Offer.where { (user_id != id) & (ended == false) & ((created_at + life_time) > DateTime.now) } 
    @q = select_offers.search(params[:q]) 
    @offers = @q.result(:distinct => true).page(params[:page]) 
    @q.build_condition 
    @q.build_sort if @q.sorts.empty? 
end 

答えて

18

私は解決策を発見しました。 述語ラベルを変更するには、i18nを使用しました。

en.yml 

ransack: 
    asc: "ascending" 
    desc: "descending" 
    predicates: 
    cont: "contains" 
    not_cont: "not contains" 
    start: "starts with" 
    end: "ends with" 
    gt: "greater than" 
    lt: "less than" 
    ... 

検索を制限するには属性フィールド

attributes: 
    model_name: 
    model_field1: "field name1" 
    model_field2: "field name2" 
    ... 

の名前を変更する可能性もありますが、述語の代わり

= f.predicate_select 

私はに

= f.attribute_fields do |a| 
    = a.attribute_select 
= f.select :p, { 'custom predicate name1' => :predicate1, 'custom predicate name2' => :predicate2 } 

を使用しました制限テーブル検索fi唯一-オプション:

<%= f.predicate_select only: [:cont, :not_cont, :eq, :not_eq, :blank, :null, :not_null] %> 

残念ながら渡された配列内の要素の順序はdoesnのELDのは、私がpredicate_selectフォームヘルパーの述部が、あなたのように配列を渡すことができ限界まで

UNRANSACKABLE_ATTRIBUTES = ["id", "published", "created_at"] 

def self.ransackable_attributes auth_object = nil 
    (column_names - UNRANSACKABLE_ATTRIBUTES) + _ransackers.keys 
end 
+0

ファンサスな質問と回答、それに誇り、あなたは最近、Ransackの詳細を掘り下げたようですので、私の質問をご覧ください:http://stackoverflow.com/questions/13241481/in-form-sorting -using-ransack-gem-not-working 私は本当にいくつかの助けを使うことができました。ありがとうございました – jlstr

+0

こんにちは、お手数ですが、UNRANSACKABLE_ATTRIBUTES配列の特定のメソッドを除外する方法があるかどうか分かりますか?たとえば、リレーションシップによって作成されたメソッドを除外したいと思います。私の場合、製品は製品タイプに属し、製品タイプはドロップダウンを表示しています。それを削除する方法はありますか?前もって感謝します! – jlstr

+0

ここですべての述語を確認できます:https://github.com/activerecord-hackery/ransack/blob/master/lib/ransack/constantsrb –

8

をモデルに追加しましたまったく問題ありません。述語のソートはこの方法では機能しません。


あなたは化合物(_any & _all)を好きではない、あるいは(Iなど)あなたにも渡すことができるため、彼らが優れているかわからない場合は、次の化合物-オプション:

<%= f.predicate_select compounds: false %> 

希望しました。アーニーはこれまでに面白かったと驚くべきことをたくさんしましたが、彼らの文書は粘着テープのようなものです。とても薄く、あなたが手を上げようとすると立ち往生します。

+1

化合物の説明をありがとう! – daveomcd

+0

最後に、私は中毒化合物を殺すことができます! – ineedahero