在我之前创建的控制器中查找的搜索功能

Search function that looks within my previously created controller

我认为这是一个简单的问题,但我找不到它。 我一直关注this guide做一个搜索功能。本教程实际上使用 SQL 而我使用的是 PostgreSQL,但我认为这没有任何区别。

我希望它在我的 PlantTable 数据库中搜索 Plant_ID,而不是在 Store 数据库中查找 name

这是教程显示的内容:

#app/controllers/page_controller.rb 

  def index
  end
  def search  
    if params[:search].blank?  
      redirect_to(root_path, alert: "Empty field!") and return  
    else  
      @parameter = params[:search].downcase  
      @results = Store.all.where("lower(name) LIKE :search", search: @parameter)  
    end  
  end
end

但我实际上将它添加到我的家庭控制器中 这是我最后的尝试

#app/controllers/home_controller.rb

class HomeController < ApplicationController
  def index
  end
  def search
    @plant_tables = PlantTable.all
    #So I can get PlantTable from a different controller  
    if params[:search].blank?  
      redirect_to(root_path, alert: "Empty field!") and return  
    else  
      @parameter = params[:search].downcase  
      @results = @plant_tables.all.where("Plant_ID LIKE :search", search: @parameter)
      #I removed lower() because my Plant_ID is written like this.  
    end  
  end
end

向我的 routes.rb 添加了代码: get '/search' => 'pages#search', :as => 'search_page'

但是在我的 app/views/home/search.html.erb...

<h3>Search Result</h3>  

    <% @results.each do |result| %>  
        <%= result.name %><br>  
    <% end %>

...我收到以下错误:

ActiveRecord::StatementInvalid in Home#search

PG::UndefinedColumn: ERROR:  column "plant_id" does not exist
LINE 1: ...ELECT "plant_tables".* FROM "plant_tables" WHERE (Plant_ID L...
                                                             ^
HINT:  Perhaps you meant to reference the column "plant_tables.Plant_ID".

由于列名的特殊情况,您必须将其用引号引起来并将其转换为文本以执行 LIKE 查询:

PlantTable.where('"Plant_ID" LIKE ?', @parameter)

通知;

  • 将列名用单引号括起来,where 的参数将不起作用。
  • 您可以删除链接在 @results 上的第二个 all