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
相关产品推荐
相关产品推荐

