pg_search multisearch STI使用基类

时间:2015-11-16 19:22:10

标签: ruby-on-rails pg-search

我正在构建一个评论网站,用户可以在其中查看多种类型的商家。使用STI存储业务,用户拥有自己的模型。我想实现一个搜索栏,人们可以搜索用户或企业。输入pg_search

module Business
  class Venue < Base
    include PgSearch
    multisearchable :against => [:name, :address, :locality, :region]
  end
end

module Business
  class Service < Base
    include PgSearch
    multisearchable :against => [:name, :address, :locality, :region]
  end
end

用户模型在这里并不重要。问题是pg_search使用Business :: Base作为所有业务子类的可搜索类型。

PgSearch::Multisearch.rebuild(Business::Venue)

返回

(0.3ms)  INSERT INTO "pg_search_documents" (searchable_type, searchable_id, content, created_at, updated_at)
SELECT 'Business::Base' AS searchable_type, ...

有没有办法在我的模型中指定searchable_type,或者有什么原因导致它不起作用?

1 个答案:

答案 0 :(得分:0)

您可以将第二个参数(布尔值)传递给rebuild方法,以防止它删除所有记录。

def rebuild(model, clean_up=true)                                                                                                                                                                           
  model.transaction do                                                                                                                                                                                      
    PgSearch::Document.where(:searchable_type => model.base_class.name).delete_all if clean_up                                                                                                              
    Rebuilder.new(model).rebuild                                                                                                                                                                            
  end                                                                                                                                                                                                       
end

因此,如果您有多个继承的模型,您可以执行以下操作:

PgSearch::Document.where(searchable_type: 'Business::Base').delete_all
PgSearch::Multisearch.rebuild(Business::Venue, false)
PgSearch::Multisearch.rebuild(Business::Service, false)