2012-09-21 103 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我加的視場,以

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/constants。rb –

8

模型限制在predicate_select形式的輔助謂詞,你可以傳遞一個數組:只有選項:

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

不幸的是,通過數組中的元素順序沒有按根本不在乎如此排序謂詞不起作用這種方式。


如果你不喜歡化合物(_any & _all)或者甚至不知道他們是什麼好(我),你也可以通過:化合物選項:

<%= f.predicate_select compounds: false %> 

希望有所幫助。厄尼到目前爲止已經做了很多有趣而令人驚歎的事情,但他們的文件卻有點像膠帶:非常非常薄,如果你試圖抓住它,你會陷入困境。

+1

非常感謝化合物的解釋! – daveomcd

+0

最後 - 我可以殺死有毒化合物! – ineedahero