Rails - Как не оценивать поле в поисковой форме Ransack - PullRequest
5 голосов
/ 28 октября 2011

Я использую Ransack Gem в Rails 3.1.Все работает как положено.Тем не менее, у меня есть форма поиска, которая будет искать человека, использующего столбец Soundex , с которым у меня возникла проблема.

В моей форме у меня есть поле «Given_name_soundex_cont», в которое пользователь вводит имя «Джо».Мой контроллер затем преобразует «joe» в код soundex, а затем Ransack ищет совпадение в столбце «Given_name_soundex».

Все соответствующие записи возвращаются и выглядят нормально, за исключением того, что поле, в которое пользователь ввелслово "joe" теперь отображает вместо этого значение soundex (конечно, потому что я изменил параметр).

Итак, я решил, что могу просто добавить поле "Given_name_cont" и скрыть поле "Given_name_soundex_cont", но теперь Ransack хочетвключить в запрос «данный_имя_конт», чего я не хочу.

Кто-нибудь знает, как я могу включить поля в форму поиска 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| %>
  <label>Given Name:</label>
  <%= f.text_field :given_name_soundex_cont %>

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

Ответы [ 3 ]

1 голос
/ 15 марта 2012

Создайте вымогатель, который форматирует параметр. Я не пробовал это, но я думаю, что это будет работать (через https://github.com/ernie/ransack/issues/36).

ransacker :given_name_soundex, :formatter => proc {|v| Text::Soundex.soundex(v)} do
  parent.table[:given_name_soundex]
end
0 голосов
/ 18 октября 2012

Я хотел добиться чего-то подобного, то есть заменить пробелы в пользовательском вводе подстановочным знаком SQL %, чтобы поле поиска «Foo Bar» соответствовало «Foo Bar», но также и «Foomster Q. Bar».и "Foo Glolubar".Я также хотел добавить подстановочный знак в начало и конец фактического параметра поиска, чтобы "Fiefoo Newton Barrister" также совпадал.

Вот как.Соответствующие части app/controllers/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

Соответствующие части представления app/views/customers/index.html.erb (разметка span4, span8 и btn btn-large btn-primary обеспечивается Twitter Bootstrap framework ):

<% 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>
      <br/>
      <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.Они относятся к пользовательскому предикату поиска, который я определил в файле config/initializers/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, но после поиска в полях ввода поисковой формы по-прежнему отображается искомое условие, введенное пользователем изначально.

(В результатах поиска у меня есть ссылка от имени клиента на отдельного клиента, что приведет к загрузке представления app/views/customers/show.html.erb.)

0 голосов
/ 15 марта 2012

Вы можете повторно использовать params[:q][:given_name_soundex] в своем представлении, чтобы переопределить значение, переданное #ransack / #search.

...