18

我有一个“帖子”表,其属性包括titlebody

post_controller.rb:

class PostsController < ApplicationController
  def index
    @posts = Post.search(params[:search], params[:id])
  end
end

index.html.erb:

 <%= form_tag posts_path, :method => 'get'  do %>
   <%= text_field_tag :search, params[:search]%>
   <%= submit_tag "Search", :name => nil  %>
 <% end %>

<hr />
<table>
  <tr>
    <th>Title</th>
    <th>Text</th>
  </tr>
 <tr>
  <td><hr></td>
  <td><hr></td>
</tr>
  <% @posts.each do |post| %>

    <tr>
      <td><%= post.title %></td>
      <td><%= post.text %></td>
      <td><%= link_to 'Show', :action => :show, :id => post.id %></td>
      <td><%= link_to 'Edit', :action => :edit, :id => post.id %></td>
      <td><%= link_to 'Destroy', { :action => :destroy, :id => post.id }, :method => :delete, :confirm => 'Are you sure?' %></td>
    </tr>
    <tr>
      <td><hr></td>
      <td><hr></td>
    </tr>
  <% end %>
</table>

和 post.rb

def self.search(search, id)
 if search
   where(['name LIKE ?', "%#{search}%"])
 else
  scoped
 end
end

当我提交搜索参数时,我收到一条错误消息:

ActiveRecord::StatementInvalid in Posts#index 
SQLite3::SQLException: no such column: name: SELECT "posts".* FROM "posts"  WHERE (name LIKE '%lorem%') 

Extracted source (around line #23):

23:   <% @posts.each do |post| %>

APD:我想按“标题”进行搜索。

4

3 回答 3

45

虽然这不是您问题的直接答案,但这里有一些资源可以帮助您学习搜索并在 Rails 应用程序中实现它。

一个简单的搜索表单

高级搜索表单

使用 AJAX 搜索

太阳黑子宝石的强大搜索功能

最受欢迎的 Ruby 搜索工具列表

- - - - - - - -更新 - - - - - - - -

Elasticsearch 之所以越来越受欢迎,是因为它具有一些现代的功能,例如即时索引。它有一颗名为轮胎的红宝石。绝对值得一看。

弹性搜索

---------------更新 2----------------

Tire 已退役,已被Elasticsearch-ruby取代

于 2012-08-17T18:28:57.767 回答
12

对于来到这里并在 Rails 4 中寻找解决方案的人,请尝试以下示例:

职位控制器:

class PostsController < ApplicationController
  def index
    if params[:search]
      @posts = Post.search(params[:search]).order("created_at DESC")
    else
      @posts = Post.all.order('created_at DESC')
    end
  end
end

岗位型号:

def self.search(search)
  # Title is for the above case, the OP incorrectly had 'name'
  where("title LIKE ?", "%#{search}%")
end

除了搜索表单之外,index.html.erb 保持不变:

<%= form_tag(posts_path, :method => "get", id: "search-form") do %>
  <%= text_field_tag :search, params[:search], placeholder: "Search Posts" %>
  <%= submit_tag "Search" %>
<% end %>

请注意,您使用的路径、控制器和列可能不同。

于 2015-10-08T13:07:57.817 回答
10

使用 gem searchkick进行 Elasticsearch

注意:searchkick 也是由轮胎贡献的)让你工作起来更舒服。

更多参考:

搜索踢

于 2014-01-18T06:10:32.987 回答