Rails Advanced搜索没有返回所需的结果



这是我第一次实施高级搜索。我正在模仿宠物发现者,但是对于狗来说,希望搜索功能与宠物发现者相似,寻找宠物。我期望的结果是让用户输入他们所需的偏好对他们正在寻找的狗(品种,年龄,性别,位置等),以及当他们单击搜索时,它重定向并促成所需的狗。我根本没有出现错误,只是没有得到所需的结果。

如果您需要其他信息,请告诉我。

我想补充一点,如果我在searchs_controller.rb中取出if语句,并且只有: @dogs = Dog.search(params[:location], params[:breed], params[:age], params[:gender]).all,那么它给了我这个错误:

ActionView::Template::Error - PG::UndefinedFunction: ERROR:  operator does not exist: integer ~~ unknown
LINE 1: ...n LIKE '%92603%' AND breed LIKE '%corgi%' AND age LIKE '%Bab...
                                                             ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
: SELECT "dogs".* FROM "dogs" WHERE (location LIKE '%92603%' AND breed LIKE '%corgi%' AND age LIKE '%Baby%' AND gender LIKE '%female%'):

app/controllers/searchs_controller.rb

class SearchsController < ApplicationController
    def index
      if params[:search]                                                                                                                                    
         @dogs = Dog.search(params[:location], params[:breed], params[:age], params[:gender]).all
      else
          @dogs = Dog.all.order("age ASC")
       end
    end
end

app/models/dog.rb

之前:

class Dog < ApplicationRecord
  def self.search(location, breed, age, gender)                                                                                                           
    return all unless location.present? || breed.present? || age.present? || gender.present?
    where(['location LIKE ? AND breed LIKE ? AND age LIKE ? AND gender LIKE ?', "%#{location}%", "%#{breed.downcase}%", "%#{age}%", "%#{gender.               downcase}%"])
  end
end

之后:

def self.search(location, breed, age, gender) 
    return all unless location.present? || breed.present? || age.present? || gender.present?
    where('location @@ ? AND breed @@ ? AND age = ? AND gender @@ ?', location, breed.downcase, age, gender.downcase)
  end

app/views/搜索/index.html.erb

<div class="doge-info">
   <% @dogs.each do |d| %>                                                                                                                                 
      <h2>Meet: <%= d.name %></h2>
      <h4><%= d.name %> is a <%= d.breed %></h4>
      <% if d.gender.titleize == "Female" %>
        <h4>She is <%= d.age %> years old.</h4>
      <% else %>
        <h4>He is <%= d.age %> years old.</h4>
      <% end %>
   <% end %>
 </div>

app/views/dogs/_form.html.erb

更新了03/08:

<div class="search-for-dogs-form">
  <%= form_tag searchs_index_path, method: "get", class: "search-dogs" do %>
    <div id="form-searching-for-dogs">
      <div class="location">
        <% label_tag :location, class: "location-label" %>
        <%= number_field_tag :location, params[:location], max: 0..5, placeholder: "Zip Code", class: "zip-code-area" %>
      </div>
      <div class="dog-breed">
        <% label_tag :breed, class: "breed-label" %>
        <%= text_field_tag :breed, params[:breed], placeholder: "Breed", class: "breed-text-field" %>
      </div>
      <div class="dog-age">
        <p class="age-name">Choose an Age Range:</p>
        <%= radio_button_tag :age, "#{0..2}" %>
        <%= label_tag :age_baby, "0-2 years", class: "age-baby" %>
        <%= radio_button_tag :age, "#{3..5}" %>
        <%= label_tag :age_young, "3-5 years", class: "age-young" %>
        <%= radio_button_tag :age, "#{6..8}" %>
        <%= label_tag :age_adult, "6-8 years", class: "age-adult" %>
      </div>
      <div class="dog-gender">
        <% label_tag :gender, class: "gender-label" %>
        <%= text_field_tag :gender, params[:gender], placeholder: "Dog Gender", class: "gender-text-field" %>
      </div>
      <div class="submit-button-for-search">
        <%= submit_tag "Search for Dogs", name: nil, class: "dog-search-submit-button" %>
      </div>
    </div>
  <% end %>
</div>

app/config/doutes.rb

   devise_for :admins
   root to: 'homepages#index'
   resources :dogs, only: [:index, :show]
   get "searchs/index"
   namespace :admin do
     resources :dogs
   end

db/schema.rb

create_table "dogs", force: :cascade do |t|
    t.string "name"
    t.integer "age"
    t.string "breed"
    t.string "gender"
    t.boolean "adoptable"
    t.datetime "post_date"
    t.string "color"
    t.string "size"
    t.string "birth_date"
    t.string "photo"
    t.string "location"
  end

您使用的是PostgreSQL,LIKE在MySQL中的工作方式并不相同。您需要使用ilike@@

where(['location LIKE ? AND breed LIKE ? AND age LIKE ? AND gender LIKE ?', "%#{location}%", "%#{breed.downcase}%", "%#{age}%", "%#{gender.downcase}%"])

psql为

where('location ILIKE ? AND breed ILIKE ? AND age ILIKE ? AND gender ILIKE ?', "%#{location}%", "%#{breed.downcase}%", "%#{age}%", "%#{gender.downcase}%")

where('location @@ ? AND breed @@ ? AND age @@ ? AND gender @@ ?', location, breed.downcase, age, gender.downcase)

我建议观看此http://railscasts.com/episodes/343-full-text-search-in-postgresql?view = asciicast

使用此宝石。https://github.com/activerecord-hackery/ransack

它将更容易获得您要寻找的结果。

我认为问题是您正在使用LIKE对整数运行。没有对您的模式的描述,但是SQL错误似乎指出了一个年龄是整数,并且您无法对Integer运行LIKE

如果要针对整数运行类似,则首先需要将其施放到VARCHAR(可以在SQL中完成)。在PostgreSQL中,您可以在查询中调用以下命令:to_char(numeric, text)。它根据您输入的格式 text parameter。

最新更新