2011-10-28 26 views
5

Tôi đang sử dụng Đá quý Ransack trong Rails 3.1. Mọi thứ hoạt động như mong đợi. Tuy nhiên, tôi có một mẫu tìm kiếm sẽ tra cứu một người sử dụng a Soundex column mà tôi đang gặp vấn đề.Đường ray - Cách không đánh giá một trường trong biểu mẫu tìm kiếm Ransack

Trong biểu mẫu của tôi, tôi có trường "given_name_soundex_cont", người dùng sẽ nhập tên "Joe". Bộ điều khiển của tôi chuyển đổi "joe" thành mã âm thanh, và sau đó Ransack tìm kiếm một kết quả phù hợp trong cột "given_name_soundex".

Tất cả các bản ghi trùng khớp được trả lại và có vẻ tốt, ngoại trừ trường mà người dùng nhập từ "joe" bây giờ sẽ hiển thị giá trị âm thanh thay thế (tất nhiên vì tôi đã thay đổi tham số).

Vì vậy, tôi figured tôi chỉ có thể thêm một trường "given_name_cont" và ẩn trường "given_name_soundex_cont", nhưng bây giờ Ransack muốn bao gồm "given_name_cont" trong truy vấn, mà tôi không muốn.

Có ai biết cách tôi có thể bao gồm các trường trong biểu mẫu tìm kiếm Ransack mà không Ransack thực sự đánh giá chúng. Bằng cách đó tôi có thể xác định các trường nào được đánh giá và không được đánh giá.

Nếu nó giúp đây là những gì tôi có trong bộ điều khiển của tôi:

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 

Và theo quan điểm của tôi:

<%= search_form_for @q do |f| %> 
    <label>Given Name:</label> 
    <%= f.text_field :given_name_soundex_cont %> 

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

Trả lời

0

Bạn có thể tái sử dụng params[:q][:given_name_soundex] theo quan điểm của bạn để ghi đè giá trị truyền cho #ransack/#search.

1

Tạo một ransacker định dạng tham số. Tôi đã không cố gắng này, nhưng tôi nghĩ rằng nó sẽ làm việc (thông qua 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

tôi muốn đạt được một cái gì đó tương tự, có nghĩa là, thay thế các khoảng trắng trong đầu vào của khách hàng bởi các ký tự đại diện SQL %, do đó lĩnh vực tìm kiếm "Foo Bar" trận đấu "Foo Bar", mà còn "sẽ Foomster Q. Bar "và" Foo Glolubar ". Tôi cũng muốn để thêm ký tự đại diện vào đầu và cuối của thông số tìm kiếm thực tế, vì vậy rằng "Fiefoo Newton Barrister" cũng sẽ là một kết quả phù hợp.

Dưới đây là cách thực hiện. Các bộ phận có liên quan của 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 

Các bộ phận có liên quan của quan điểm app/views/customers/index.html.erb (các span4, span8btn btn-large btn-primary đánh dấu được cung cấp bởi Twitter's 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> 

Bạn sẽ nhận thấy các vị từ tìm kiếm customer_name_whitespaces_match_anythingcustomer_address_whitespaces_match_anything. Những tham chiếu này tùy thuộc vào một vị từ tìm kiếm tùy chỉnh mà tôi đã xác định trong tệp config/initializers/ransack.rb. nội dung của nó là:

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 

Bây giờ thuật ngữ tìm kiếm được munged bởi vị tùy chỉnh trước khi nó trao cho SQL truy vấn, nhưng sau khi tìm kiếm, lĩnh vực đầu vào các hình thức tìm kiếm vẫn hiển thị hạn tìm kiếm đầu vào người sử dụng ban đầu .

(Trong các kết quả tìm kiếm, tôi có một liên kết từ tên của khách hàng cho cá nhân khách hàng, mà sẽ gây ra những quan điểm app/views/customers/show.html.erb là nạp.)

Các vấn đề liên quan