代码之家  ›  专栏  ›  技术社区  ›  hendrikbeck

rails activerecord sweet operator(<<)更新在日志中没有异常成功

  •  2
  • hendrikbeck  · 技术社区  · 6 年前

    我的数据模型包含可能有附件的会议。我的update_meeting api包含以下行(除其他行外):

    attachment = Attachment.new(image: params[:attachment], user: current_user)
    begin
      attachment.save!
      @meeting.attachments << attachment
      NotificationManager.add_attachment_to_meeting(current_user, @meeting, attachment)
    rescue
      puts "Error occured trying to upload attachment: #{attachment.inspect}, #{attachment.errors.inspect}"
    end
    

    我们遇到了一个特殊的情况,即创建了一个附件,但它与数据库中的会议没有关联。我开始在原木上挖掘以找出发生了什么事。我看不到任何错误、异常、回滚等等。尤其是这三条线:

    (0.7ms)  BEGIN
    SQL (1.0ms)  UPDATE "attachments" SET "updated_at" = $1, "meeting_id" = $2 WHERE "attachments"."id" = $3  [["updated_at", 2018-07-06 13:57:52 UTC], ["meeting_id", 434], ["id", 51]]
    (1.3ms)  COMMIT
    

    我的假设(在看到这个之前)是,如果有一个update语句后面跟着一个commit,而没有回滚或错误消息,或者日志中的任何内容,那么它应该成功。但显然不是。

    有人指出哪里出了问题吗?我完全不知道从哪里开始找。不知道如何重现,不知道要添加哪些日志消息以使下次发生时更轻松,不确定…

    我使用的是运行在ec2上的rails 5和postgresql。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Luiz E.    6 年前

    让会议创建附件

    begin
      attachment = @meeting.attachments.create(image: params[:attachment], user: current_user)
      NotificationManager.add_attachment_to_meeting(current_user, @meeting, attachment)
    rescue
      puts "Error occured trying to upload attachment: #{attachment.inspect}, #{attachment.errors.inspect}"
    end
    

    会议应该像附件的“聚合器”。附件不应该存在或者至少不存在,因为它们没有会议存在,所以它们应该通过会议创建。