我正在尝试在我的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 ,我会收到上面提到的两个错误。我可以在两个不同的模型之间进行搜索,但是我无法从视图中显示结果。我不确定我做错了什么或者我错过了一些重要的事情。我真的不确定。我试图保持简短,并试图包含相关信息。如果需要任何特定代码,请告诉我。一如既往,非常感谢任何帮助!!
答案 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 %>
如果结果对象具有名称(即 - 如果是用户),则显示名称,否则显示组织名称(如果是记分板)。请注意,这不是一个很好的解决方案,因为它现在在您的视图中引入了逻辑,但它解释了这个问题。