You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PGSearch多搜索创建记录时如何更新新增的record_created_at字段?

解决pg_search_documents的record_created_at字段更新问题

我之前也遇到过类似的困扰!pg_search在创建PgSearch::Document记录时(比如通过multi-search功能),并不是通过常规的ActiveRecord create方法初始化模型实例,而是直接执行SQL插入语句,所以你给PgSearch::Document模型加的after_create回调根本不会触发。

下面是两种靠谱的解决方法:

方法1:使用pg_search自带的after_index回调

pg_search为需要被索引的业务模型(比如你的Post/Product这类模型,而非PgSearch::Document)提供了after_index钩子,它会在索引创建或更新时触发。你可以在业务模型里编写逻辑,同步更新对应的pg_search_documents记录:

# 示例:假设你的业务模型是Post
class Post < ApplicationRecord
  include PgSearch::Model
  # 定义你的搜索范围
  pg_search_scope :search_posts, against: [:title, :content]

  # 索引操作完成后更新对应搜索文档的record_created_at
  after_index do |post|
    search_doc = PgSearch::Document.find_by(searchable: post)
    if search_doc
      search_doc.update(record_created_at: post.created_at)
    end
  end
end

方法2:直接在索引时附加属性(更高效)

这种方法不需要事后更新,而是在创建PgSearch::Document记录时直接传入record_created_at的值,性能更好。你可以在pg_search_scope里通过additional_attributes参数指定要附加的字段:

class Post < ApplicationRecord
  include PgSearch::Model
  pg_search_scope :search_posts,
    against: [:title, :content],
    # 直接将业务模型的created_at映射到搜索文档的record_created_at
    additional_attributes: lambda { |post| { record_created_at: post.created_at } }
end

补充说明

  • 如果是已经存在的旧记录,需要重新执行索引才能让record_created_at字段生效,运行以下命令即可:
    PgSearch::Multisearch.rebuild(Post) # 替换成你的业务模型名
    
  • 两种方法里,方法2更推荐,因为它避免了额外的数据库更新操作,一步到位完成字段赋值。

内容的提问来源于stack exchange,提问作者Siddu hadapad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:40:48