我可能在这里误解了一些东西。
我有一个模型Secondant,我在我的模型rspec中使用Fabrication创建。
main_user = Fabricate :user, email: TESTEMAIL
sec = Fabricate :secondant, email: SECEMAIL, user_id: main_user.id
sec_user = Fabricate :user, email: SECEMAIL
ActionMailer::Base.deliveries = []
debugger
此时,当我查看sec模型中secondant_id的值时,该属性为空(它在after_create回调中填充)。当我检索刚从数据库中创建的模型时,该属性被填充。为什么这两个不同步?
27 main_user = Fabricate :user, email: TESTEMAIL
28 sec = Fabricate :secondant, email: SECEMAIL, user_id: main_user.id
29 sec_user = Fabricate :user, email: SECEMAIL
30 ActionMailer::Base.deliveries = []
31 debugger
=> 32 sec.destroy
33 end
34
35 it 'should have a secondant_id assigned' do
36 sec.secondant_id.should_not be_nil
(rdb:1) e sec
#<Secondant id: 519, user_id: 1095, email: "secondant@hotmail.com", secondant_id: nil, created_at: "2013-10-10 13:13:29", updated_at: "2013-10-10 13:13:29", reported: false>
(rdb:1) e Secondant.where(id: sec.id).first
#<Secondant id: 519, user_id: 1095, email: "secondant@hotmail.com", secondant_id: 1096, created_at: "2013-10-10 13:13:29", updated_at: "2013-10-10 13:13:29", reported: false>
我的after_create回调:
def find_user
user = User.where(email: self.email).first
if user
# create the link to the user
self.secondant_id = user.id
self.save
# see if this is the second one
if Secondant.where('user_id = ? and secondant_id is not null', user_id).count == 2
user.do_somthing
end
end
return
end
在用户类中有一个类似的回调,在这种情况下触发(感谢Peter)
def find_secondant
Secondant.where(email: email).find_each do |sec|
sec.secondant_id = id
sec.save
end
end
答案 0 :(得分:0)
在您创建sec
时,尚未创建具有相同电子邮件的用户,因此您的after_save
回调应该不设置secondant_id
。
我只能假设您的find_user
方法是由于您在调试器中执行的User
创建或where
操作而被调用的,从而导致{{1当时正在设置的字段。除非{直到你执行secondant_id
,否则它不会反映在sec
中,因为reload
创建的Ruby对象与where
Ruby对象不同。