我有关于用户和站点的模型,它们之间存在一个通过has_many through
关系的联系。在sites_users
连接表中还有一项额外的数据is_default
,它是布尔类型,旨在允许每个用户从相关站点列表中选择一个默认站点。
用户模型
class User < ApplicationRecord
has_many :sites_users
has_many :sites, through: :sites_users
accepts_nested_attributes_for :sites_users, allow_destroy: true
...
end
用户工厂
factory :user do
sequence(:email) { |n| "user_#{n}@example.com" }
role { Role.find_by(title: 'Marketing') }
image { Rack::Test::UploadedFile.new(Rails.root.join('spec', 'support', 'fixtures', 'user.jpg'), 'image/jpeg') }
factory :super_admin do
role { Role.find_by(title: "Super Admin") }
admin true
end
before :create do |u|
u.sites_users.build(site: site, is_default: true)
end
结束
备选用户工厂方法
在用户工厂上,我也尝试了下面包含的方法,但是找不到一种方法来使用这种语法包括 is_default: true
。所以最终我放弃了这种方法,选择了上面的 before_create
调用。
factory :user do
...
site { site }
...
end
我非常感谢任何人能够提供帮助。谢谢!
模式信息
表:用户
t.string "email", default: "", null: false
t.boolean "admin", default: false
t.integer "role_id"
t.string "first_name"
t.string "last_name"
表格:t.string "domain", default: "", null: false
t.string "name", default: "", null: false
t.string "logo"
t.string "logo_mark"
table: sites_users
t.bigint "site_id", null: false
t.bigint "user_id", null: false
t.boolean "is_default", default: false