我想通过使用pg_search gem在我的Rails应用程序中实现搜索功能。我在documentation中设置了所有内容。然后,我设置了一个带有show action的搜索控制器:
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建立了一个我之前从未处理过的多态关联 - 这可能是问题吗?
提前致谢
答案 0 :(得分:2)
<%= @pg_search_documents.each do |document| %>
<% end %>
这是一个经典错误,我记得在我第一次开始学习Rails时感到困惑。错误是将<%= %>
与each
一起使用。 each
的返回值是您要迭代的数组(在本例中为@pg_search_documents
),并且使用<%=
,您告诉Rails从中创建一个字符串数组并将其插入到您的视图中。这通常不是您想要的:您希望视图由您传递给each
的块内的代码生成。
改为使用<% @pg_search_documents.each do |document| %>
(省略=
),您将避免转储数组的内容。
你可能还需要使用.searchable
,因为@blelump建议,但我想回答你问题的另一半,因为这是一个常见的陷阱。
答案 1 :(得分:1)
要返回原始源模型,需要对这些搜索结果记录进行searchable
调用,例如:
<% @pg_search_documents.each do |document| %>
<%= document.searchable %>
<% end %>
您也可以切换回控制器中的源模型,例如:
@pg_search_documents = PgSearch.multisearch(search_params).collect(&:searchable)
然后,@pg_search_documents
将包含Vessel
个元素。