【发布时间】:2018-07-01 10:32:34
【问题描述】:
在我的控制器中,我经常有这样的功能:
@account = Account.new(account_params)
if @account.save
if @account.guest?
...
else
AccountMailer.activation(@account).deliver_later
@account.update_column(:activation_sent_at, Time.zone.now)
flash[:success] = "We've sent you an email."
redirect_to root_path
end
end
发送电子邮件和更新activation_sent_at属性而不必保存记录两次的最佳方式是什么?在这里调用 update_column 对我来说感觉不对,因为 AFAIK 它会创建一个额外的 SQL 查询(如果我错了,请纠正我)。
【问题讨论】:
-
解决方法是使用
assign_attributes,但我不推荐它。您的代码很好,并且更新列的附加更新查询应该没有太大区别。此外,guest?之类的检查也适用于某些不会使用 assign_attributes 调用的模型挂钩。使用它的总成本将使它有点难以阅读 -
为了优化,可以通过配置使用
deliver_later通过ActiveJob发送邮件;这将使它异步。这将确保您的控制器不会花时间撰写、处理邮件提供商和发送电子邮件。
标签: ruby-on-rails ruby activerecord