如何在Rails的相关车型配置pg_search multisearch?(How to confi

2019-06-24 06:40发布

我加入pg_search到Rails应用程序。 我不完全理解的配置,并希望在正确的方向轻柔微调。

首先,我已经有一个多模式的网站或多或少地设置和我的应用程序运行。 但我想扩展它同时搜索上相关的模型。

例如,我有制造商,汽车,模型类。 目前,如果我搜索“福特”,只返回厂家。 我也想返回所有相关汽车(属于制造商)和模型(属于汽车)。

我可以看到如何做到这一点的范围内进行搜索

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

但是,如果我尝试这样做对multisearch它不工作

class Car
  include PgSearch
  multisearchable :against => [:name], 
    :associated_against => {
        :manufacturer => [:name]
      }
end

它不产生一个错误,它根本不拿起相关的记录。

我有一种感觉,我失去了一些东西基本在我的这一切是如何结合在一起的认识。 我会很感激,如果有人可以帮助我了解这一点,或点我对信息的良好来源。 我已经通过在GitHub和相关Railscast的信息,但我仍然失去了一些东西。

Answer 1:

这是不可能的搜索相关记录与multisearch,由于多态关联在Rails和SQL是如何工作的。

我要补充,说明情况的错误,以便在将来也不会是令人费解。

对困惑感到抱歉。

你可以做的反而是定义返回你希望搜索对文本上车的方法。

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

这样,当制造商更新,它会调用所有的汽车记录,活动记录的回调,这将触发pg_search回调更新存储在相应的pg_search_documents项搜索的文本。



文章来源: How to configure a pg_search multisearch on associated models in Rails?