8

我正在将 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,但我仍然缺少一些东西。

4

1 回答 1

14

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

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

对困惑感到抱歉。

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

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

  def manufacturer_name
    manufacturer.name
  end
end

或者更简洁,您可以委托:

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 条目中的可搜索文本。

于 2012-05-11T00:14:35.163 回答