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

如何在Rails 7 Minitest中配置命名空间模型Fixture?

Rails 7 命名空间模型 Fixture 配置解决方案

问题根源

你遇到的错误是因为Fixture 文件路径与模型表名不匹配:由于Users模块设置了table_name_prefix: 'users_',Users::Setting对应的数据库表名是users_settings,而非按命名空间路径解析的users/settings。Rails 误将test/fixtures/users/settings.yml识别为User模型的嵌套关联 Fixture,因此去users表查找不存在的user_id/user字段。

正确配置步骤

1. 调整 Fixture 文件路径与命名

将Users::Setting的 Fixture 文件命名为test/fixtures/users_settings.yml(对应表名users_settings),而非放在users/子目录下。

2. 编写 Fixture 内容

  • User 模型 Fixture(test/fixtures/users.yml):
default_user:
  email: user@example.com
  # 补充你的 User 模型其他必填字段
  • Users::Setting 模型 Fixture(test/fixtures/users_settings.yml):
default_setting:
  user: default_user # 关联 users.yml 中的 default_user 条目
  # 补充你的 Users::Setting 模型其他字段,例如:
  theme: dark
  notifications_enabled: true

3. 简化模型关联(可选但推荐)

Rails 7 能自动推断关联的class_name和foreign_key,可以简化模型代码:

# app/models/user.rb
class User < ApplicationRecord
  has_one :setting, class_name: 'Users::Setting'
end

# app/models/users/setting.rb
class Users::Setting < ApplicationRecord
  belongs_to :user
end

4. 测试中使用关联

在测试用例中正常调用关联即可:

test "user has a setting" do
  user = users(:default_user)
  assert_equal users_settings(:default_setting), user.setting
end

test "setting belongs to user" do
  setting = users_settings(:default_setting)
  assert_equal users(:default_user), setting.user
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:19:55