2012-09-21 3 views
10

고급 덩어리 검색을 사용하면 다소 혼란 스럽습니다. 나는 모든 테이블 이름을 검색 용어로 선택할 수없고 모든 술어가 사용되지 않는 사용자 정의 검색을 수행하려고합니다. 이 튜토리얼으로 railscast 사용했지만 술어의 수를 제한하는 방법을 찾을 수 없습니다. 다른 언어 (단순히 레이블)로 언어와 표의 이름을 사용할 수 있습니까?Ransack gem에서 술어 및 사용자 정의 술어 이름을 선택하십시오.

내 검색 폼 나는 해결책을 발견

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

= 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}" 

내 컨트롤러. 술어 레이블을 변경하려면 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.attribute_fields do |a| 
    = a.attribute_select 
= f.select :p, { 'custom predicate name1' => :predicate1, 'custom predicate name2' => :predicate2 } 

을 사용

= f.predicate_select 

의 술어를 제한하기 위해 필드 제한 표 검색 fi 전용 옵션 :

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

불행하게도 전달 된 배열의 요소 순서가 아무튼 필드들 본인은 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/constants).rb –

8

를 모델에 추가 전혀 상관 없으므로 술어 정렬은 이런 식으로 작동하지 않습니다.


당신은 화합물 (_any & _all) 마음에 들지 않으면 심지어 그들이 (나는대로) 당신은 또한 전달할 수 있습니다에 대한 좋은 모르겠어요 : 화합물-옵션 :

<%= f.predicate_select compounds: false %> 

희망을 얻었습니다. 어니는 지금까지 흥미롭고 놀라운 것들을 많이 했었지만 그들의 문서는 일종의 끈적 거리는 테이프였습니다. 아주 얇은 것이고 손에 쥐기 만하면 막히게 될 것입니다.

+1

화합물 설명에 감사드립니다. – daveomcd

+0

마지막으로 - 나는 중독 된 화합물을 죽일 수 있습니다! – ineedahero