我正在将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的信息,但我仍然遗漏了一些东西。
发布于 2012-05-11 08:14:35
由于多态关联在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这样,当制造商更新时,它将在所有汽车记录上调用活动记录回调,这将触发pg_search回调来更新存储在相应pg_search_documents条目中的可搜索文本。
https://stackoverflow.com/questions/10512945
复制相似问题