ruby-on-rails - 如何在 Rails 中的关联模型上配置 pg_search 多重搜索?

标签 ruby-on-rails pg-search

我正在将 pg_search 添加到 Rails 应用程序中。我并不完全了解配置,希望能在正确的方向轻轻插入。

首先,我已经或多或少地在我的应用程序上设置并运行了一个多模型站点。但我想将其扩展为也搜索相关模型。

例如,我有制造商、汽车、模型类。目前,如果我搜索“福特”,则只返回制造商。我还想退回所有关联的汽车(属于制造商)和模型(属于汽车)。

我可以看到如何将其作为范围搜索

class Car
  pg_search_scope :manufactured_by, :associated_against => {
    :manufacturer => [:name]
  }
end

但是,如果我尝试在多重搜索上执行此操作,它就行不通
class Car
  include PgSearch
  multisearchable :against => [:name], 
    :associated_against => {
        :manufacturer => [:name]
      }
end

它不会产生错误,它只是不会拾取关联的记录。

我有一种感觉,在我理解这一切如何结合在一起时,我缺少一些基本的东西。如果有人能帮助我理解这一点,或者为我指出一个好的信息来源,我将不胜感激。我已经浏览了 github 上的信息和相关的 Railscast,但我仍然缺少一些东西。

最佳答案

由于多态关联在 Rails 和 SQL 中的工作方式,不可能使用多重搜索来搜索关联记录。

我将添加一个错误来解释这种情况,以便将来不会那么困惑。

对困惑感到抱歉。

您可以做的是在 Car 上定义一个方法,该方法返回您希望搜索的文本。

class Car < ActiveRecord::Base
  include PgSearch
  multisearchable :against => [:name, manufacturer_name]
  belongs_to :manufacturer

  def manufacturer_name
    manufacturer.name
  end
end

或者更简洁,您可以委托(delegate):
class Car < ActiveRecord::Base
  include PgSearch
  multisearchable :against => [:name, manufacturer_name]
  belongs_to :manufacturer
  delegate :name, :to => :manufacturer, :prefix => true
end

但是,如果您对制造商实例进行名称更改,您必须确保 pg_search_documents 表得到更新,因此您应该添加 :touch => true对其协会:
class Manufacturer < ActiveRecord::Base
  has_many :cars, :touch => true
end

这样,当制造商更新时,它将在所有 Car 记录上调用 Active Record 回调,这将触发 pg_search 回调以更新存储在相应 pg_search_documents 条目中的可搜索文本。

关于ruby-on-rails - 如何在 Rails 中的关联模型上配置 pg_search 多重搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10512945/

相关文章:

ruby-on-rails - pg_search : ordering of "multisearchable" results

ruby-on-rails-3 - pg_search 不返回单个字段的结果

ruby-on-rails - 无法运行 rake db :migrate a tsvector GIN index for Postgresql in Rails using Railscast sample

ruby-on-rails - 添加 :staging group to My Gemfile 的正确方法是什么

ruby-on-rails - Bundler::Fetcher::CertificateFailureError | Mac OSX 10.10 上的捆绑 SSL 问题

ruby-on-rails - 如何在脚本中捕获 'puts' 产生的输出并将其保存到 ruby​​/rails 中的文件中?

ruby-on-rails - API Rails 路由,其中​​ token 是路由的一部分

ruby-on-rails - 我的 Controller (Ruby on Rails)中的所有 if 语句都被视为 true 吗?

ruby-on-rails-3 - 我应该把 PgSearch.multisearch_options 放在哪里?

ruby-on-rails - 使用ElasticSearch自动生成标签(或Thinking Sphinx/pg-search)