Raylar - Bir Ransack arama formundaki bir alanı nasıl değerlendirmezsiniz

Rails 3.1'deki Ransack Gem'i kullanıyorum. Herşey beklendiği gibi çalışır. Ancak, sahip olduğum bir Soundex sütunu kullanarak bir kişiyi arayacak bir arama formum var. ile ilgili bir sorun.

Formumda bir "given_name_soundex_cont" alan var, bir kullanıcı "Joe" adını girecek. Denetleyicim, "joe" yu bir soundex koduna dönüştürür ve ardından Ransack "given_name_soundex" sütununda bir eşleşme arar.

Tüm eşleşen kayıtlar geri döndü ve iyi görünüyor, ancak kullanıcı "joe" kelimesini girdiği alanın şimdi soundex değerini gösteriyor (tabi ki param değiştirdim çünkü).

Bu yüzden, "given_name_cont" alanını ekleyip "given_name_soundex_cont" alanını gizleyebileceğimi düşündüm, ancak şimdi Ransack istemediğim sorguya "given_name_cont" ifadesini dahil etmek istiyor.

Herhangi bir Ransack arama formunda, aslında onları değerlendiren bir Ransack arama formuna nasıl yer verebileceğimi bilen var mı? Bu şekilde hangi alanların değerlendirilip hangilerinin uygun olmadığını belirtebilirim.

Eğer bu yardımcı olursa kontrol cihazımda ne var ki:

def index

  if !params[:q].blank?  # nil.blank? and [].blank? are true
    search_params = params[:q]
    search_params[:given_name_soundex_cont] = convert_to_soundex(search_params[:given_name_soundex_cont])
    @q = Person.search(search_params)
    @results = @q.result.limit(50)
  else
    @q = Person.search(params[:q])
    @results = []
  end

end


private 
    def convert_to_soundex(text)
      Text::Soundex.soundex(text.to_s)
    end

Ve benim görüşüme göre:

<%= search_form_for @q do |f| %>
  
  <%= f.text_field :given_name_soundex_cont %>

  <%= f.submit %>
<% end %>
5

3 cevap

Parametreyi formatlayan bir ransacker oluşturun. Bunu denemedim, ancak işe yarayacağını düşünüyorum ( https://github.com/ ernie/ransack/sorunlar/36 ).

ransacker :given_name_soundex, :formatter => proc {|v| Text::Soundex.soundex(v)} do
  parent.table[:given_name_soundex]
end
1
katma

#ransack / #search 'e geçirilen değeri geçersiz kılmak için görünümünüzde params [: q] [: given_name_soundex] ' i tekrar kullanabilirsiniz.

0
katma

Benzer bir şeye ulaşmak istedim, yani SQL joker karakterine göre % müşteri girişi, böylece "Foo Bar" arama alanı maç "Foo Bar", ama aynı zamanda "Foomster Q. Bar" ve "Foo Glolubar". Bende istedim joker karakteri gerçek arama parametresinin başına ve sonuna eklemek için "Fiefoo Newton Barrister" da bir eşleşme olacak.

İşte nasıl. app/controllers/customers_controller.rb 'nin ilgili bölümleri:

class CustomersController < ApplicationController
  # GET /customers
  # GET /customers.json
  def index
    @search = Customer.search(params[:q])
    @customers = @search.result
    ...
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @customers }
    end
  end
  ...
end

Görünümün ilgili bölümleri uygulama/görüntüleme/müşteri/index.html.erb ( span4 , span8 ve btn btn-büyük btn-birincil işaretlemesi tarafından sağlanır Twitter'ın Bootstrap çerçevesi ):

<% require 'action_view' %>
<div class="row">
...
  <div class="span4"> <!-- The search criteria -->
    ...
    <%= search_form_for @search do |f| %> <!-- this is a Ransack-provided form -->
      <div class="field">
        <%= f.label :customer_name_whitespaces_match_anything, "Name is or contains:" %>
        <%= f.text_field :customer_name_whitespaces_match_anything, class: "my-textbox" %>
        ...
        <%= f.label :customer_address_whitespaces_match_anything, "Address is or contains:" %>
        <%= f.text_field :customer_address_whitespaces_match_anything, class: "my-textbox" %>
        ...
      </div>
      
<div class="actions"> <%= f.submit "Search", class: "btn btn-large btn-primary" %> </div> <% end %> </div> <div class="span8"> <!-- The search results --> ... <table border="1" cellpadding="5"> <tr> <th><%= sort_link(@search, :customer_name, "Customer name") %></th> ... <th><%= sort_link(@search, :customer_address, "Address") %></th> ... </tr> <% @customers.each do |c| %> <tr> <td><%= link_to c.customer_name, customer_path(c, search: @search) %></td> ... <td><%= c.customer_address %></td> ... </tr> <% end %> </table> </div> ... </div>

Aramanın customer_name_whitespaces_match_anything olduğunu fark edeceksiniz. ve customer_address_whitespaces_match_anything . Bunlar bir özel başvurur config/initializers/ransack.rb dosyasında tanımladığım arama yordamı. Onun içeriği:

Ransack.configure do |config|
  config.add_predicate 'whitespaces_match_anything',
  :arel_predicate => 'matches', # so we can use the SQL wildcard "%"
  # Format the incoming value: replace spaces by the SQL wildcard "%".
  :formatter => proc {|v| "%"+v.gsub(" ","%")+"%"}
end

Şimdi arama terimi, SQL'e verilmeden önce özel yüklem tarafından minderlendi sorgulama, ancak aramadan sonra arama formunun giriş alanları hala Arama terimini başlangıçta kullanıcı girişi.

(Arama sonuçlarında, müşterinin adından kişiye olan bir bağlantım var. uygulama/görüntüleme/müşteri/show.html.erb görünümüne neden olacak müşteri yüklendi.)

0
katma