Ruby on Rails - 如何在View中组合显示搜索结果

时间:2013-09-30 16:57:15

标签: ruby-on-rails ruby search view

我有搜索控制器搜索2个模型 - 帖子和类别。搜索工作正常,但是我无法在View中正确显示结果 - 我无法显示类别名称。

此时我非常困惑和沮丧,希望能找到一些帮助! 我非常肯定(99%肯定)问题出在View的某个地方,因为我可以通过渲染检查显示结果。

SearchController.rb

class SearchController < ApplicationController
  def index
    @posts = Post.search(params[:search])
    @categories = Category.search(params[:search])

    # combine the results
    @results = @posts + @categories
    @results.uniq   # may be necessary to remove duplicates
  end
end

index.html.erb(views / search)

<%= render 'posts/posts', :posts => @posts %>

_posts.html.erb(查看/帖子)

<h1>Listing posts</h1>

<table>
  <tr>
    <th>Name</th>
    <th>Category</th>
    <th>Description</th>
    <th>Flag</th>
  </tr>

  <% if posts %>
    <% posts.each do |post| %>
    <tr>
      <td><%= post.name %></td>
      <td><%= post.category.name %></td>
      <td><%= post.description %></td>
      <td><%= post.flag %></td>
    </tr>
    <% end %>
  <% else %>
    <tr><td>No posts</td></tr>
  <% end %>
</table>

我可以获得与要显示的搜索匹配的帖子,但我无法显示类别。我怎样才能做到这一点?任何帮助高度赞赏!!谢谢。

2 个答案:

答案 0 :(得分:0)

如果您使用sunspot solr之类的搜索后端,那么您可以将搜索结合起来,例如

@search = Sunspot.search [User, Company] do
  fulltext params[:search]
end
@results = @search.results

然后返回必要的值。在此示例中,它显示了您可以检索操作类的位置(controller_name)可能不起作用,具体取决于返回结果的控制器。

        <% @results.each do |result| %>
            <% case result.class.to_s %>
                <% when "Company" %>
                    <li><%= "Company: #{result.name}" %></li>
                <% when "User" %>
                    <li><%= "User: #{result.username}" %></li>
            <% end %>
        <% end %>

答案 1 :(得分:0)

答案(我包含了我改变的所有内容以使其工作+我没有更改但必须存在的几个文件),或如何进行简单搜索适用于多种型号

SearchController.rb

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

post.rb

class Post < ActiveRecord::Base
  attr_accessible :category_id :name :description :flag

  belongs_to :category

  def self.search(search)
    if search
      find(:all, :joins => :category, :conditions => ['posts.equipment LIKE ? OR posts.description LIKE ? or categories.name like ?', "%#{search}%", "%#{search}%", "%#{search}%"])
    else
      find(:all)
    end
  end

搜索/ index.html.erb

<%= render 'posts/posts', :posts => @posts %>

我添加了2个文件_post.html.erb和_category.html.erb。它们是相似的,这是_post.html.erb:

post: <%= post.name %>

(在某些情况下或某些模型可能不是必需的。我可以在其视图中搜索没有此文件的第三个模型。但是第三个模型也没有像_posts.html.erb这样的文件。 最后,_posts.html.erb保持不变:

...
<% if posts %>
  <% posts.each do |post| %>
  <tr>
    <td><%= post.name %></td>
    <td><%= post.category.name %></td>
    <td><%= post.description %></td>
    <td><%= post.flag %></td>
  </tr>
  <% end %>
<% else %>
  <tr><td>No posts</td></tr>
<% end %>
...

现在可以使用了。可以轻松地为搜索添加新模型。搜索所需的唯一其他内容是输入字段。