当我初始化新用户时,我的行为非常奇怪。
我运行@user = User.where(:provider => @provider, :uid => @shop[:uid]).first_or_initialize
设置所有已知数据,然后保存@user.save
但是当我在保存到Worker
之后立即传递用户ID时 EmailWelcome.perform_async @user.id
它将nil
作为用户ID传递。所以我的问题是有人看到过* _initialize方法的这种行为,我该怎么办?
编辑:还需要提一下,它会在DB中保存记录
答案 0 :(得分:1)
在发送给工作人员时,你确定id为nil吗?或者工作进程根据给作业的ID找不到用户?
如果您正在使用像resque或sidekiq这样的工作进程,则在事务完成之前它将无法访问该用户。如果这是问题,您需要使用after_commit
或其他方式在交易完成后排队EmailWelcome
作业。
答案 1 :(得分:0)
您必须检查用户是否已成功保存。
@user = User.where(:provider => @provider, :uid => @shop[:uid]).first_or_initialize
if @user.save
EmailWelcome.perform_async @user.id
else
p @user.errors
end
或者使用@user.save!
,如果保存失败,这种方式将抛出异常。
答案 2 :(得分:0)
我只是在寻找相同问题的答案。我有多个数据库,它正在开发中,但没有进行升级。
staging列上的id列缺少自动递增序列(在postgres中)。
还有其他需要检查的地方。
HTH