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

测试期间如何关闭Friendly_id或其History模块以提升性能?

解决Friendly_id在Rails测试中的性能问题

针对你遇到的测试性能下降问题,完全可以临时关闭slug生成或History模块,以下是几种实用方案:

动态切换Friendly_id配置

在模型里根据测试场景调整配置,默认关闭slug生成和History,仅在需要的测试中启用:

include FriendlyId

if Rails.env.test? && !Thread.current[:enable_friendly_id_history]
  # 测试环境默认禁用slug生成与History
  friendly_id :generate_slug, use: []
else
  friendly_id :generate_slug, use: [:slugged, :history]
end

然后在需要History追踪的单个测试中开启:

test "需要History追踪的业务逻辑" do
  Thread.current[:enable_friendly_id_history] = true
  # 编写你的测试代码
ensure
  Thread.current[:enable_friendly_id_history] = nil # 测试后清理状态
end

测试环境单独重载模型配置

在测试支持文件中默认关闭Friendly_id的slug和History功能,按需启用:

  1. 创建test/support/repeater_friendly_id_override.rb:
Repeater.class_eval do
  remove_friendly_id
  friendly_id :generate_slug, use: []
end
  1. 在test_helper.rb中引入该文件,让所有测试默认禁用相关功能;
  2. 在需要的测试中重新开启:
test "需要History追踪的测试" do
  Repeater.class_eval do
    remove_friendly_id
    friendly_id :generate_slug, use: [:slugged, :history]
  end
  # 测试逻辑
ensure
  # 测试结束后恢复默认配置
  Repeater.class_eval do
    remove_friendly_id
    friendly_id :generate_slug, use: []
  end
end

跳过slug生成回调

如果只是想避免生成slug,创建记录时直接跳过对应的回调:

# 不生成slug快速创建记录
repeater = Repeater.new(你的记录属性)
repeater.save(validate: false, skip_callback: :save, name: :set_slug)

注:不同版本的Friendly_id回调名称可能略有差异,需根据实际版本调整。

内容的提问来源于stack exchange,提问作者Pablo Fernandez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:01:11