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

Rails First_或_Create不更新现有记录

  •  0
  • calyxofheld  · 技术社区  · 7 年前

    与此相关 question ,我正在编写的函数会更新记录。它只是加载它。

    Blob.where(user_id: user.id, item_id: item.id).first_or_create do |s|
     s.amount += amount
    end
    

    输出: Blob Load (0.5ms) SELECT "blob".* FROM "blobs" WHERE "blobs"."user_id" = $1 AND "blobs"."item_id" = $2 ORDER BY "blobs"."id" ASC LIMIT $3 [["user_id", 2], ["item_id", 5], ["LIMIT", 1]]

    如果记录不存在,则创建记录;如果存在,则只加载记录,不更新记录。什么给予?

    2 回复  |  直到 7 年前
        1
  •  3
  •   nathanvda    7 年前

    这个 first_or_create 只在创建时执行块。这是有意的,它允许您最初设置某些值,而不在记录已经存在时覆盖它们。

    如果始终要执行块,可以按如下方式写入:

    Blob.where(user_id: user.id, item_id: item.id).first_or_create.tap do |s|
     s.amount += amount
     s.save
    end
    

    或者,我更喜欢短一点的版本

    Blob.find_or_create_by(user_id: user.id, item_id: item.id).tap do |s|
     s.amount += amount
     s.save
    end
    
        2
  •  2
  •   Abdul Haseeb    7 年前

    根据本文件: https://apidock.com/rails/ActiveRecord/Relation/first_or_create

    只有具有特定ID的记录“blob”不存在时,才会执行“r”块。该块仅在创建新实例时执行,而不是为现有记录执行。

    所以你最好这样做:

    s = Blob.where(user_id: user.id, item_id: item.id).first_or_create
    s.amount += amount
    s.save!