如何确保 SQL 语句被执行,然后才开始下一个代码步骤

How to make sure that SQL statement is executed and only then start next code step

我在执行 Ruby 代码时有非常奇怪的行为。我用 @user = User.first_or_initialize 创建新模型,然后我 @user.save 但奇怪的是,当我在它之后尝试使用 Devise 辅助方法 sign_in @user 它失败了,因为那时 SQL 查询没有被执行。我在控制台看到过。我在 sign_in @user 之后做了 puts @user.inspect。在终端,我有一个不愉快的惊喜,因为 puts @user.inspect 向我展示了没有 idUser 模型,这也意味着 sign_in @user 通过了 User 而没有 id。并且 SQL 查询 INSERT INTO users 是在所有 put 都显示在终端之后进行的。

所以基本上我的问题是,如何锁定 ruby 代码执行,直到 SQL 语句执行?因此,当我将 @user 传递给 sign_in 时,它会传递带有 idUser 模型 ???

编辑:

@user = User.where(:uid => @shop[:uid]).first_or_initialize

if @user.persisted?
  puts 'Persisted.'
  false
else
  # New customer
  ....


  @user.save

  sign_in @user
end

您确定您的模型通过了所有验证吗?您应该检查 .save 是否返回 true - 如果没有,请检查 .errors.

如果没有验证问题,应该立即执行保存。

我确定你的记录没有被保存,当你检查记录时它只显示对象的初始化副本,你可以使用 save! 查看是否有任何异常或 User.first_or_create!

@user = User.first_or_initialize
@user.save!