Rails first_or_initialize无法及时设置id?

时间:2015-04-22 05:20:25

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

当我初始化新用户时,我的行为非常奇怪。

我运行@user = User.where(:provider => @provider, :uid => @shop[:uid]).first_or_initialize

之类的代码

设置所有已知数据,然后保存@user.save

但是当我在保存到Worker

之后立即传递用户ID时

EmailWelcome.perform_async @user.id

它将nil作为用户ID传递。所以我的问题是有人看到过* _initialize方法的这种行为,我该怎么办?

编辑:还需要提一下,它会在DB中保存记录

3 个答案:

答案 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