0

我想通过使用 pg_search gem 在我的 Rails 应用程序中实现搜索功能。我已经按照文档中的说明设置了所有内容。然后我设置了一个带有显示操作的搜索控制器:

def show
  @pg_search_documents = PgSearch.multisearch(search_params)
end

搜索本身有效,但我认为我有一个非常烦人的问题。无论我做什么,它总是输出一组 PgSearch::Document 对象。即使我只在我看来写这个:

<%= @pg_search_documents.each do |document| %>
<% end %>

我明白了(我已经缩短了它):

[#<PgSearch::Document id: 2, content: "…", searchable_id: 28, searchable_type: "Vessel">, #<PgSearch::Document id: 3, content: "…", searchable_id: 27, searchable_type: "Vessel">]

我知道 pg_search 建立了一个我以前从未处理过的多态关联——这可能是问题吗?

提前致谢

4

2 回答 2

2
<%= @pg_search_documents.each do |document| %>
<% end %>

这是一个典型的错误,我记得当我第一次开始学习 Rails 时,我对此感到困惑。错误是使用<%= %>with each。的返回值each是您正在迭代的数组(在本例中为@pg_search_documents),通过使用<%=,您告诉 Rails 从该数组创建一个字符串并将其插入到您的视图中。这通常不是您想要的:您希望视图由您传递给的块内的代码生成each

改为使用<% @pg_search_documents.each do |document| %>(省略=),您将避免转储数组内容。

您可能还需要.searchable按照@blelump 的建议使用,但我想回答您问题的另一半,因为这是一个常见的陷阱。

于 2014-11-10T23:15:35.093 回答
1

要返回原始源模型,searchable需要对这些搜索结果记录进行调用,例如:

<% @pg_search_documents.each do |document| %>
  <%= document.searchable %>
<% end %>

您还可以在控制器中切换回源模型,例如:

@pg_search_documents = PgSearch.multisearch(search_params).collect(&:searchable)

然后,@pg_search_documents将包含Vessel元素。

于 2014-11-10T20:08:40.113 回答