如何确保 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
向我展示了没有 id
的 User
模型,这也意味着 sign_in @user
通过了 User
而没有 id
。并且 SQL 查询 INSERT INTO users
是在所有 put 都显示在终端之后进行的。
所以基本上我的问题是,如何锁定 ruby 代码执行,直到 SQL 语句执行?因此,当我将 @user
传递给 sign_in
时,它会传递带有 id
的 User
模型 ???
编辑:
@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!
我在执行 Ruby 代码时有非常奇怪的行为。我用 @user = User.first_or_initialize
创建新模型,然后我 @user.save
但奇怪的是,当我在它之后尝试使用 Devise 辅助方法 sign_in @user
它失败了,因为那时 SQL 查询没有被执行。我在控制台看到过。我在 sign_in @user
之后做了 puts @user.inspect
。在终端,我有一个不愉快的惊喜,因为 puts @user.inspect
向我展示了没有 id
的 User
模型,这也意味着 sign_in @user
通过了 User
而没有 id
。并且 SQL 查询 INSERT INTO users
是在所有 put 都显示在终端之后进行的。
所以基本上我的问题是,如何锁定 ruby 代码执行,直到 SQL 语句执行?因此,当我将 @user
传递给 sign_in
时,它会传递带有 id
的 User
模型 ???
编辑:
@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!