【问题标题】:Rails Model.update deletes nested attachmentRails Model.update 删除嵌套附件
【发布时间】:2021-09-25 10:20:30
【问题描述】:

我有一个 Rails 6 应用程序。

User has_one Shop

Shop has_one_attached Logo

User.updatenested_attributes 清除 User.shop.company_logo

class User
  has_one :shop, dependent: :destroy # delete Shop if user gets deleted 
  accepts_nested_attributes_for :shop, # also tried reject_if: :all_blank
end

class Shop
  belongs_to :user
  has_one_attached :company_logo do |attachable|
    attachable.variant :thumbnail, resize_to_fill: [100, 100]
  end
end


# creating a User
User.create({name: "Test"})

# creating a Shop
logo = File.open(Rails.root.join('spec', 'fixtures', 'files', '400x400.png'))
Shop.create(user_id: User.last.id, name: "TestShop", company_logo: logo)
User.last.shop.company_logo.attached? # returns TRUE !!!

# Update User (deletes / detaches company_logo) 
params = {name: "TestUpdateName", shop: {name: "TestUpdateShop"}}
User.last.update(params)
User.last.shop.company_logo.attached? # returns FALSE !!!

控制台输出:

[ActiveJob] Enqueued ActiveStorage::PurgeJob (Job ID: caebfa82-7c41-4eb9-b295-c213449e0a7e) to Async(active_storage_purge) with arguments: #<GlobalID:0x00007fcf6ae179e0 @uri=#<URI::GID gid://meta-shop/ActiveStorage::Blob/81>>
ActiveStorage::Blob Load (1.7ms)  SELECT "active_storage_blobs".* FROM "active_storage_blobs" WHERE "active_storage_blobs"."id" = $1 LIMIT $2  [["id", 81], ["LIMIT", 1]]
[ActiveJob] [ActiveStorage::PurgeJob] [caebfa82-7c41-4eb9-b295-c213449e0a7e] Performing ActiveStorage::PurgeJob (Job ID: caebfa82-7c41-4eb9-b295-c213449e0a7e) from Async(active_storage_purge) enqueued at 2021-09-25T10:01:32Z with arguments: #<GlobalID:0x00007fcf5a8856b8 @uri=#<URI::GID gid://meta-shop/ActiveStorage::Blob/81>>
[ActiveJob] [ActiveStorage::PurgeJob] [caebfa82-7c41-4eb9-b295-c213449e0a7e]   TRANSACTION (2.0ms)  BEGIN
[ActiveJob] [ActiveStorage::PurgeJob] [caebfa82-7c41-4eb9-b295-c213449e0a7e]   ActiveStorage::Attachment Exists? (2.1ms)  SELECT 1 AS one FROM "active_storage_attachments" WHERE "active_storage_attachments"."blob_id" = $1 LIMIT $2  [["blob_id", 81], ["LIMIT", 1]]
[ActiveJob] [ActiveStorage::PurgeJob] [caebfa82-7c41-4eb9-b295-c213449e0a7e]   ActiveStorage::Attachment Load (2.8ms)  SELECT "active_storage_attachments".* FROM "active_storage_attachments" WHERE "active_storage_attachments"."record_id" = $1 AND "active_storage_attachments"."record_type" = $2 AND "active_storage_attachments"."name" = $3 LIMIT $4  [["record_id", 81], ["record_type", "ActiveStorage::Blob"], ["name", "preview_image"], ["LIMIT", 1]]
[ActiveJob] [ActiveStorage::PurgeJob] [caebfa82-7c41-4eb9-b295-c213449e0a7e]   ActiveStorage::Blob Destroy (8.8ms)  DELETE FROM "active_storage_blobs" WHERE "active_storage_blobs"."id" = $1  [["id", 81]]
[ActiveJob] [ActiveStorage::PurgeJob] [caebfa82-7c41-4eb9-b295-c213449e0a7e]   TRANSACTION (5.1ms)  COMMIT
[ActiveJob] [ActiveStorage::PurgeJob] [caebfa82-7c41-4eb9-b295-c213449e0a7e]   S3 Storage (224.0ms) Deleted file from key: mx5g91bi8qwgvh6a8vzh65598kd3
[ActiveJob] [ActiveStorage::PurgeJob] [caebfa82-7c41-4eb9-b295-c213449e0a7e]   S3 Storage (311.1ms) Deleted files by key prefix: variants/mx5g91bi8qwgvh6a8vzh65598kd3/
[ActiveJob] [ActiveStorage::PurgeJob] [caebfa82-7c41-4eb9-b295-c213449e0a7e] Performed ActiveStorage::PurgeJob (Job ID: caebfa82-7c41-4eb9-b295-c213449e0a7e) from Async(active_storage_purge) in 568.39ms

当使用nested_attributes 更新时,如何保留User.shop.company_logo

【问题讨论】:

  • 嗯,您确实更新了用户并为 Shop 提供了新参数。这类似于 PUT 请求(而不是 PATCH)删除了附件。我觉得这本身就是一种错误的做法。很高兴有人提供替代解决方案。
  • 我的目标是不替换 Shop,它应该只是补充(或编辑给定的嵌套字段)。

标签: ruby-on-rails ruby-on-rails-6 activemodel


【解决方案1】:

我找到了解决办法:

我的 Shop 模型在通过父 User 模型更新时被替换。但是有一个选项可以添加到“一对一”关系上,例如has_one。这是update_only 选项,默认为false。使用它时,嵌套模型会在使用update_only: false时更新而不是替换

accepts_nested_attributes_for :shop, update_only: true

https://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html#method-i-accepts_nested_attributes_for

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    相关资源
    最近更新 更多