Rails输出多态关联

时间:2014-11-10 19:57:03

标签: ruby-on-rails ruby polymorphic-associations pg-search

我想通过使用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建立了一个我之前从未处理过的多态关联 - 这可能是问题吗?

提前致谢

2 个答案:

答案 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个元素。