首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Rails中的关联模型上配置pg_search多搜索?

如何在Rails中的关联模型上配置pg_search多搜索?
EN

Stack Overflow用户
提问于 2012-05-09 17:04:54
回答 1查看 7.1K关注 0票数 8

我正在将pg_search添加到Rails应用程序中。我不能完全理解这个配置,如果能在正确的方向上轻轻一推,我会很高兴。

首先,我已经或多或少地在我的应用上建立并运行了一个多模型网站。但我想将其扩展到相关模型上的搜索。

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

我可以通过作用域搜索来了解如何做到这一点

代码语言:javascript
复制
class Car
  pg_search_scope :manufactured_by, :associated_against => {
    :manufacturer => [:name]
  }
end

但是,如果我尝试在多个搜索上这样做,它不会起作用

代码语言:javascript
复制
class Car
  include PgSearch
  multisearchable :against => [:name], 
    :associated_against => {
        :manufacturer => [:name]
      }
end

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

我有一种感觉,在我对这一切如何组合在一起的理解中,我遗漏了一些基本的东西。如果有人能帮助我理解这一点,或者告诉我一个好的信息来源,我会非常感激的。我已经浏览了github和相关的Railscast的信息,但我仍然遗漏了一些东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-11 08:14:35

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

我将添加一个错误来解释这种情况,这样在将来它就不会那么混乱了。

很抱歉给你造成了混乱。

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

代码语言:javascript
复制
class Car < ActiveRecord::Base
  include PgSearch
  multisearchable :against => [:name, manufacturer_name]
  belongs_to :manufacturer

  def manufacturer_name
    manufacturer.name
  end
end

或者更简洁地说,你可以委托:

代码语言:javascript
复制
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添加到其关联中:

代码语言:javascript
复制
class Manufacturer < ActiveRecord::Base
  has_many :cars, :touch => true
end

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

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10512945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档