Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用pg_搜索搜索多个模型_Ruby On Rails_Postgresql_Search - Fatal编程技术网

Ruby on rails 使用pg_搜索搜索多个模型

Ruby on rails 使用pg_搜索搜索多个模型,ruby-on-rails,postgresql,search,Ruby On Rails,Postgresql,Search,我正在尝试在rails应用程序中实现全文搜索。我使用PostgreSQL作为数据库,因此使用PostgreSQL的全文搜索功能。我有两个模型用户和记分板,我想搜索这两个模型中的特定列以提取记录 我使用pg_search gem进行全文搜索,我阅读了multisearch文档并成功地实现了所有内容。我已经创建了pg_search_documents表。代码如下所示 记分板模型 include PgSearch multisearchable :against => [:name_of_

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

我使用pg_search gem进行全文搜索,我阅读了multisearch文档并成功地实现了所有内容。我已经创建了pg_search_documents表。代码如下所示

记分板模型

include PgSearch
   multisearchable :against => [:name_of_organization, :name_of_activity, :name_of_scoreboard]
include PgSearch
  multisearchable :against => :name
用户模型

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_documents.each do |pg_search| %>
        <%= pg_search.searchable.name %>
        <%= pg_search.searchable.name_of_organization %>
<% end %>
当我在视图中运行代码
时,搜索工作正常。这将在搜索每个用户和记分板对象时返回它们

查看代码

 def index
   @pg_search_documents = PgSearch.multisearch(params[:search])
 end
<% @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>. 
未定义的方法#的_记分板名称_。
当我试图搜索记分板的名称时,我也会遇到类似的错误

`undefined method `name' for #<Scoreboard:0x00000006fa3560>.` 
未定义的#的方法'name'
如果我在视图中使用以下代码,
,则会显示用户和记分板的id。这意味着我只能搜索两个模型中常见的列

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

我认为您混淆了“搜索”和显示结果中的列-看起来您的代码实际上是在多个模型中搜索不同的字段。然后,该搜索返回指向匹配对象的“文档”数组。您遇到的问题是,您试图显示一个没有名称的对象的名称。我想你要做的就是这样

<% @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 %>

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

我认为您将“搜索”和显示结果中的列混合在一起-看起来您的代码实际上是在多个模型的不同字段中搜索。然后,该搜索返回指向匹配对象的“文档”数组。您遇到的问题是,您试图显示一个没有名称的对象的名称。我想你要做的就是这样

<% @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 %>


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

@Tom Walpole非常感谢您,这确实有效。我理解if和else语句。不过,你介意解释一下代码吗。尽管如此,我还是可以通过阅读理解代码。我不完全明白。此外,什么是放置与视图相关的逻辑的最佳位置。我通常将if和else语句放在视图中,该代码只查看对象是否有“name”方法,因为scoreboard对象没有,所以它只与用户匹配。如果pg_search.searchable.is_a?用户因为如果使用name方法将其他对象添加到结果中,它将继续工作(请参见duck键入)。为了从装饰器模式上读取的视图中删除逻辑,或者您可以只为每个结果渲染一个部分,这将在部分渲染中隐藏逻辑,因为它将为每种类型的结果对象使用不同的部分-render@pg_search_documents.to_a@Tom Walpole非常感谢您提供如此详细的答案。我真的很感谢你的帮助。再次感谢!!@汤姆·沃尔波尔非常感谢你,这绝对有效。我理解if和else语句。不过,你介意解释一下代码吗。尽管如此,我还是可以通过阅读理解代码。我不完全明白。此外,什么是放置与视图相关的逻辑的最佳位置。我通常将if和else语句放在视图中,该代码只查看对象是否有“name”方法,因为scoreboard对象没有,所以它只与用户匹配。如果pg_search.searchable.is_a?用户因为如果使用name方法将其他对象添加到结果中,它将继续工作(请参见duck键入)。为了从装饰器模式上读取的视图中删除逻辑,或者您可以只为每个结果渲染一个部分,这将在部分渲染中隐藏逻辑,因为它将为每种类型的结果对象使用不同的部分-render@pg_search_documents.to_a@Tom Walpole非常感谢您提供如此详细的答案。我真的很感谢你的帮助。再次感谢!!