Рэйкі - Як не ацаніць поле ў форме пошуку Ransack

Я выкарыстоўваю Ransack Gem ў Rails 3.1. Усё працуе, як чакалася. Тым не менш, у мяне ёсць форма пошуку, якая будзе шукаць чалавека з дапамогай слупка Soundex што я маю праблема з.

У маёй форме У мяне ёсць поле «given_name_soundex_cont», што карыстач уводзіць імя «Джо». Мой кантролер, чым новазвернутыя «джо» да кодзе SOUNDEX, а затым Ransack шукае супадзення ў калонцы «given_name_soundex».

Ўсе адпаведныя запісы вяртаюцца і, здаецца, добра, за выключэннем таго, што поле, дзе карыстальнік ўвёў слова «джо» зараз паказвае значэнне SOUNDEX замест (вядома, таму што я змяніў параметры).

Такім чынам, я меркаваў, што я мог бы проста дадаць полі «given_name_cont» і схаваць полі «given_name_soundex_cont», але цяпер Ransack хоча ўключыць «given_name_cont» ў запыце, які я не хачу.

Хто-небудзь ведае, як я магу ўключаць поля ў форме пошуку Ransack без Ransack фактычна іх ацэнкі. Такім чынам, я магу паказаць, якія поля ВЗ быць ацэнены і якія не з'яўляюцца.

Калі гэта дапамагае, гэта тое, што ў мяне ў кантролеры:

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

І на мой погляд:

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

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

3 адказы

Стварэнне рабаўніка, які фарматуе параметр. Я не спрабаваў гэта, але я думаю, што ён будзе працаваць (праз https://github.com/ Ernie/Ransack/пытанні/36 ).

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

Вы можаце паўторна выкарыстоўваць Params [: Q] [: given_name_soundex] на ваш погляд, каб перавызначыць значэнне, якое перадаецца #ransack / #search .

0
дададзена

Я хацеў дамагчыся чагосьці падобнага, гэта значыць, замяніць пробельные ў ўвод кліента з дапамогай SQL шаблону % , так што поле пошуку «Foo Bar» будзе адпавядаць "Foo Bar", але і "Foomster Q. Bar" і "Foo Glolubar". Я таксама хацеў дадаць падстаноўныя ў пачатак і канец фактычнага параметру пошуку, так што «Fiefoo Ньютан Буквоед» таксама будзе матч.

Вось як. Адпаведныя часткі дадатак/кантралёры/customers_controller.rb :

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

Адпаведныя часткі прадстаўлення дадатак/праглядаў/кліентаў/index.html.erb ( <Код> span4 , span8 і БТН БТН-вялікая БТН-першасны разметкі забяспечваецца шчабятаць Bootstrap рамкі ):

<% 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>

Вы заўважыце, пошукавыя прэдыкаты customer_name_whitespaces_match_anything і customer_address_whitespaces_match_anything . Яны ставяцца да карыстацкай пошук прэдыкатаў, які я вызначыў у файл конфіг/Инициализаторы/ransack.rb . яго змест:

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

У цяперашні час тэрмін пошуку страціцца ў карыстацкім прэдыкатаў, перш чым ён даў у SQL запыт, але пасля пошуку, палі ўводу формы пошуку па-ранейшаму паказваць пошук па ключавым слове, уведзены карыстачу першапачаткова.

(У выніках пошуку, у мяне ёсць сувязь ад імя кліента да твару Кліент, які будзе выклікаць выгляд дадатак/праглядаў/кліентаў/show.html.erb быць загружаны.)

0
дададзена