1

我有一个用户可以通过电子邮件发送的状态报告,我想在交付操作完成后将列 :sent_mail 更新为 true。

def send_status
  date = Date.today
  reports = current_user.reports.for_date(date)
  ReportMailer.status_email(current_user, reports, date).deliver
  reports.update_all(sent_mail: true)
end

和表类

AddSentMailToReports < ActiveRecord::Migration
  def change
    add_column :reports, :sent_mail, :boolean, default: false
  end
end

但是,在控制台中,sent_mail 仍然设置为 false。任何想法为什么这不起作用?谢谢!

4

3 回答 3

6

这是因为 update_all 将更新直接发送到数据库 - 它不会更新您在内存中的报告模型。如果您在运行当前版本后检查数据库,您会看到记录已更新。

您需要在每个报告上调用“重新加载”以从数据库中获取更新版本或

reports.map(&:reload)

一口气完成所有这些。

于 2012-09-26T09:47:27.800 回答
0

如果 update_all 或 update_attribute 不起作用,您可以使用它

reports.update_attributes(:sent_mail => true)
于 2012-09-26T09:41:38.253 回答
-1

参考和update_all_update_attributesupdate_attribute

改变

reports.update_all(sent_mail: true)

reports.update_attribute('sent_mail', true)

update_attribute 和 update_attributes 有区别update_attribute vs update_attributes

于 2012-09-26T09:36:51.903 回答