gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:06:57 25 4
gpt4 key购买 nike

我正在将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com