【问题标题】:Ruby on Rails - How to combine display Search results in the ViewRuby on Rails - 如何在视图中组合显示搜索结果
【发布时间】:2013-09-30 16:57:14
【问题描述】:

我有搜索 2 个模型的搜索控制器 - 帖子和类别。搜索有效,但我无法在视图中正确显示结果 - 我无法显示类别名称。

此时我感到非常困惑和沮丧,希望能得到一些帮助! 我很确定(99% 确定)问题出在某处的视图中,因为我可以通过渲染检查获得结果来显示。

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(查看/搜索)

<%= 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>

我可以显示与搜索匹配的帖子,但我无法显示类别。我怎样才能做到这一点?任何帮助都非常感谢!谢谢。

【问题讨论】:

  • 我已经解决了我的问题。我不太明白为什么它还有效。但本质上它正在寻找我没有的文件 /categories/_category 和 /posts/_post 。这不是显而易见的,红宝石!不明显。除了第一行,我删除了 Controller 中的所有内容。我没有修改 _posts.html.erb 。我稍后会在答案中发布完整的代码。如果使用黑子,我也喜欢 kobaltz 的解决方案。

标签: ruby-on-rails ruby search view


【解决方案1】:

如果您使用像 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 %>

【讨论】:

  • 我没有使用任何后端搜索程序。我真的很想在不求助于太阳黑子或任何其他搜索程序的情况下解决这个问题,但如果我不能,我将不得不尝试这个。谢谢。
  • 我刚刚在另一个应用程序上尝试了这个,但我没有从 @search.results 得到任何东西,这对你有什么作用?
【解决方案2】:

答案(我包括了我为使其工作而更改的所有内容+一些我没有更改但必须存在的文件),或如何进行简单搜索适用于多个模型

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 %>
...

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

【讨论】:

    猜你喜欢
    • 2016-04-07
    • 2014-06-19
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2015-04-20
    • 1970-01-01
    • 2018-02-17
    相关资源
    最近更新 更多