gpt4 book ai didi

ruby-on-rails - pg_search : Using a dynamic method as the against parameter

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:25 32 4
gpt4 key购买 nike

根据this的接受答案问题,你应该能够使用实例方法的返回值作为反对参数......

class Car < ActiveRecord::Base
include PgSearch
multisearchable :against => [:name, manufacturer_name]
belongs_to :manufacturer

def manufacturer_name
manufacturer.name
end
end

但是,当我尝试在一个干净的应用程序中执行此操作(以排除真实应用程序中的冲突代码)并创建上述模型、数据库等时,我得到一个未定义的局部变量或方法错误——我错过了什么?

最佳答案

好吧,简短的故事是链接帖子中提供的代码没有也不能工作,因为它看起来好像你不能以这种方式引用方法(实例或其他)——这是有道理的:类需要编译以使该方法可用,但不能,因为它需要所述方法才能进行编译。

为了实现我最初的尝试(不覆盖 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

希望这对其他人有帮助。

关于ruby-on-rails - pg_search : Using a dynamic method as the against parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21395704/

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