这是一个严重的rails
新手。我知道我可以在我的模型中使用before_save
和after_save
挂钩来控制在创建父项时写入 has_many 记录,但我不知道如何传递我想在该子记录中创建的值。
在我的场景中,一个用户has_many memberships
到学校。目前,当我创建一个用户时,它会创建一个membership
没有正确初始值的空白记录。如何在初始化时向用户传递它需要插入到 has_many 记录中的值?
我一直在做的是在用户之后手动创建成员资格记录,但这给了我两个成员资格,一个具有正确的字段值,一个具有初始“nil”值,以及我在测试中手动创建的记录。
class User
has_many :memberships
has_many :group_user_memberships
has_many :schools, through: :memberships
#creates a membership with nil values in some fields
@user = create(user_type)
#creates the correct, but secondary memberhsip
member = @user.memberships.create(school_id: school.id, role_id: role.id)
我不想做的是必须创建用户,找到会员ID,然后将会员中的school_id更新为a)有这么多的SQL
操作,b)没有办法获得正确的记录刚刚为该用户创建。
school_id
因为我的用户通过会员资格与学校有关系,所以我希望能够找到一种nested_attributes
将school_id
我想要的是在创建用户时填充学校和角色,并让这些创建成员记录。我认为这与before/after
钩子有关,但很想知道最佳解决方案
提前致谢
编辑
所以,这是我在测试中使用的代码,使用 Factory Girl。也许这是问题的一部分 - 如果我使用 rails 控制台,我会得到这个 u = User.create(:firstname => "Dsd", :surname => "", :email => "aa@sdd.com" )你。确认!
我得到一个没有成员身份的用户 SQL 插入(或者至少日志显示没有成员身份插入)
INSERT INTO `users` (`active`, `confirma..... etc
在我的测试中,使用 Factory Girl,我确实获得了会员资格。所以也许这是工厂女孩,但我看不到我在工厂的哪里获得会员资格。这是我的用户工厂
FactoryGirl.define do
factory :user do
sequence(:email){ |n| "user#{n}@example.com".downcase }
firstname "MyString"
surname "MyString"
password "a1234567"
active false
factory :an_administrator do
after(:create){|a| a.roles << create(:admin_role)}
end
factory :a_pupil do
after(:create){|a| a.roles << create(:pupil_role)}
end
end
end
和我的角色工厂
FactoryGirl.define do
factory :role do
factory :admin_role do |f|
name 'administrator'
end
factory :pupil_role do |f|
name 'pupil'
end
end
end
所以是的,我想这是工厂女孩 - 创建一个 user_with_school_membership 可能是答案?