我有一个类似的问题,比如this old one related to using namespaced fixtures for a has_one/belong_to association in Rails 7.
关于 ActiveRecord,在我的模型文件中我有:
# app/models/user.rb
class User < ApplicationRecord
has_one :setting, :class_name => 'Users::Setting', :foreign_key => 'user_id'
end
# app/models/users/setting.rb
module Users
class Setting < ApplicationRecord
belongs_to :user, :class_name => 'User', :foreign_key => 'user_id'
end
end
# app/models/users.rb
module Users
def self.table_name_prefix
'users_'
end
end
关于固定装置,在我创建并成功使用以下用户模型的 test/fixtures/users.yml 文件中:
# test/fixtures/users.yml
foo:
id: 1
name: Foo
email: [email protected]
...
bar:
id: 2
name: Bar
email: [email protected]
...
但是我在为 Users::Setting 模型设置固定装置时遇到了麻烦。我尝试创建 test/fixtures/users/settings.yml 文件并使用以下内容但没有成功:
# test/fixtures/users/settings.yml
_fixture:
model_class: Users::Setting
foo_setting:
id: 1
user_id: 1
...
# foo_setting:
# id: 1
# user: foo
# ...
当我运行测试时,出现如下错误:
Minitest::UnexpectedError: ActiveRecord::Fixture::FixtureError: 表 “用户”没有名为“user_id”/“用户”的列。
在用户固定装置中,我也尝试使用以下但我得到相同的 Minitest 错误:
# test/fixtures/users.yml
foo:
id: 1
name: Foo
email: [email protected]
setting: foo_setting (Users:Setting) # <<<
...
如何为命名空间的 Users::Setting 声明工作装置?
您为命名空间的 Users::Setting 模型构建固定装置的方式似乎存在问题。以下是解决此问题的方法:
在您的 test/fixtures/users/settings.yml 文件中,您不需要指定 _fixture 块,因为 Rails 会根据命名空间文件位置推断出正确的模型。像这样定义你的固定装置:
# test/fixtures/users/settings.yml
foo_setting:
id: 1
user_id: 1
# ... other attributes
bar_setting:
id: 2
user_id: 2
# ... other attributes
在你的test/fixtures/users.yml文件中,你可以通过fixture标签指定User和Users::Setting模型之间的关联。像这样更新您的 users.yml:
# test/fixtures/users.yml
foo:
id: 1
name: Foo
email: [email protected]
setting: foo_setting
# ... other attributes
bar:
id: 2
name: Bar
email: [email protected]
setting: bar_setting
# ... other attributes
现在,当您运行测试时,Rails 应该正确关联 User 和 Users::Setting fixture,并且您不应该遇到“表‘users’没有名为‘user_id’/‘user’的列”错误。