使用pg_search搜索多个模型

时间:2016-01-21 01:58:48

标签: ruby-on-rails postgresql search

我正在尝试在我的rails应用中实现全文搜索。因此,我使用PostgreSQL作为数据库,使用PostgreSQL的全文搜索功能。我有两个模型用户和记分板,我想根据特定列搜索两个模型以提取记录。

我正在使用pg_search gem进行全文搜索,我阅读了多元文档并成功实现了所有内容。我创建了pg_search_documents表。代码如下。

记分牌模型

include PgSearch
   multisearchable :against => [:name_of_organization, :name_of_activity, :name_of_scoreboard]

用户模型

include PgSearch
  multisearchable :against => :name

控制器代码

 def index
   @pg_search_documents = PgSearch.multisearch(params[:search])
 end

当我在视图中运行代码<%= pg_search.searchable %>时,搜索会起作用。这会在搜索每个用户和记分板OBJECTS时返回它们。

查看代码

<% @pg_search_documents.each do |pg_search| %>
        <%= pg_search.searchable.name %>
        <%= pg_search.searchable.name_of_organization %>
<% end %>

但是,当我尝试运行上面给出的视图代码并搜索名称时,我会收到以下错误,

undefined method `name_of_scoreboard' for #<User:0x007fa44ad18cd8>. 

当我尝试搜索name_of_scoreboard时,我收到类似的错误,

`undefined method `name' for #<Scoreboard:0x00000006fa3560>.` 

如果我在我的视图<%= @pg_search_documents.searchable.id %>中使用以下代码,则会显示用户和记分板的ID。这意味着我只能搜索两个模型中常见的列。

如果我尝试搜索两个不同的列,例如 name和name_of_scoreboard ,我会收到上面提到的两个错误。我可以在两个不同的模型之间进行搜索,但是我无法从视图中显示结果。我不确定我做错了什么或者我错过了一些重要的事情。我真的不确定。我试图保持简短,并试图包含相关信息。如果需要任何特定代码,请告诉我。一如既往,非常感谢任何帮助!!

1 个答案:

答案 0 :(得分:3)

我认为你正在混淆“搜索”并显示结果中的列 - 看起来你的代码实际上是在多个模型中的不同字段中搜索。然后该搜索返回指向匹配对象的“文档”数组。您遇到的问题是您正在尝试显示没有名称的对象的名称。我认为以下内容就是您的目标。

<% @pg_search_documents.each do |pg_search| %>
  <% if pg_search.searchable.respond_to?(:name) %>
    <%= pg_search.searchable.name %>
  <% else %>
    <%= pg_search.searchable.name_of_organization %>
  <% end %>
<% end %>

如果结果对象具有名称(即 - 如果是用户),则显示名称,否则显示组织名称(如果是记分板)。请注意,这不是一个很好的解决方案,因为它现在在您的视图中引入了逻辑,但它解释了这个问题。