根据this问题的接受答案,你应该能够使用实例方法的返回值作为反对参数......
class Car < ActiveRecord::Base
include PgSearch
multisearchable :against => [:name, manufacturer_name]
belongs_to :manufacturer
def manufacturer_name
manufacturer.name
end
end
然而,当我尝试在一个干净的应用程序(以排除真实应用程序中的冲突代码)中使用上述模型,db等创建时,我得到一个未定义的局部变量或方法错误 - 我缺少什么?
答案 0 :(得分:2)
好吧,简短的故事是链接帖子中提供的代码没有也不能正常工作,好像你不能用这种方式引用方法(实例或其他方式) - 这是有道理的:类需要编译以使方法可用,但不能,因为它需要所述方法才能进行编译。
要实现我最初的尝试(不覆盖pg_search),我采取了以下步骤:
首先,反对声明应使用符号代替原始方法调用。
multisearchable :against => [:name, :manufacturer_name]
这样做,当保存对象时,将使用manufacturer_name
方法创建/更新PgSearch :: Document。但是,如果您尝试使用以下错误重建搜索索引,则会中断:
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column cars.manufacturer_name does not exist
LINE 5: ...sce("cars".name::text, '') || ' ' || coalesce("cars"...
^
: INSERT INTO "pg_search_documents" (searchable_type, searchable_id, content, created_at, updated_at)
SELECT 'Car' AS searchable_type,
"cars".id AS searchable_id,
(
coalesce("cars".name::text, '') || ' ' || coalesce("cars".manufacturer_name::text, '')
) AS content,
'2014-01-29 14:08:00.190767' AS created_at,
'2014-01-29 14:08:00.190767' AS updated_at
FROM "cars"
要解决此问题,请覆盖由Multisearch模块添加的rebuild_pg_search_documents类方法,以构建动态SQL插入查询,而不是回复现有的纯SQL INSERT INTO table_name (columns) SELECT etc
查询:
def self.rebuild_pg_search_documents
cars = Car.all
query_str = 'INSERT INTO pg_search_documents (searchable_type, searchable_id, content, created_at, updated_at) VALUES'
cars.each do |car|
query_str += "('Car', #{car.id}, '#{car.name} #{car.manufacturer_name}', NOW(), NOW())"
query_str += ', ' unless car == cars.last
end
query_str += ';'
connection.execute query_str
end
希望这会帮助别人。