rubysherpas / paranoia

acts_as_paranoid for Rails 5, 6 and 7
Other
2.87k stars 524 forks source link

It doesn't soft-delete records when updating `collection_ids` when using `has_many` with `:through` #538

Open janko opened 1 year ago

janko commented 1 year ago

Here is a self-contained example demonstrating the issue:

require "active_record"
require "paranoia"

ActiveRecord.version # => #<Gem::Version "6.1.6.1">

ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Schema.define do
  create_table :tenants do |t|
  end
  create_table :permission_groups do |t|
  end
  create_table :permission_group_memberships do |t|
    t.references :tenant, foreign_key: true
    t.references :permission_group, foreign_key: true
    t.datetime :deleted_at
  end
end

class Tenant < ActiveRecord::Base
  has_many :permission_group_memberships
  has_many :permission_groups, through: :permission_group_memberships
end

class PermissionGroupMembership < ActiveRecord::Base
  acts_as_paranoid

  belongs_to :tenant
  belongs_to :permission_group
end

class PermissionGroup < ActiveRecord::Base
end

tenant = Tenant.create!
permission_group_1 = PermissionGroup.create!
permission_group_2 = PermissionGroup.create!

permission_group_membership_1 = PermissionGroupMembership.create!(
  tenant: tenant,
  permission_group: permission_group_1,
)

ActiveRecord::Base.logger = Logger.new($stdout)

tenant.update!(permission_group_ids: [permission_group_2.id])

Here I would expect the removed permission group membership to be soft-deleted, but it gets hard-deleted.

D, [2023-01-30T15:05:11.784742 #57434] DEBUG -- :   TRANSACTION (0.1ms)  begin transaction
D, [2023-01-30T15:05:11.784887 #57434] DEBUG -- :   PermissionGroup Load (0.1ms)  SELECT "permission_groups".* FROM "permission_groups" WHERE "permission_groups"."id" = ?  [["id", 2]]
D, [2023-01-30T15:05:11.787746 #57434] DEBUG -- :   PermissionGroup Load (0.0ms)  SELECT "permission_groups".* FROM "permission_groups" INNER JOIN "permission_group_memberships" ON "permission_groups"."id" = "permission_group_memberships"."permission_group_id" WHERE "permission_group_memberships"."deleted_at" IS NULL AND "permission_group_memberships"."tenant_id" = ?  [["tenant_id", 1]]
D, [2023-01-30T15:05:11.788246 #57434] DEBUG -- :   PermissionGroupMembership Destroy (0.0ms)  DELETE FROM "permission_group_memberships" WHERE "permission_group_memberships"."deleted_at" IS NULL AND "permission_group_memberships"."tenant_id" = ? AND "permission_group_memberships"."permission_group_id" = ? AND "permission_group_memberships"."deleted_at" IS NULL  [["tenant_id", 1], ["permission_group_id", 1]]
D, [2023-01-30T15:05:11.788759 #57434] DEBUG -- :   PermissionGroupMembership Create (0.0ms)  INSERT INTO "permission_group_memberships" ("tenant_id", "permission_group_id") VALUES (?, ?)  [["tenant_id", 1], ["permission_group_id", 2]]
D, [2023-01-30T15:05:11.788916 #57434] DEBUG -- :   TRANSACTION (0.0ms)  commit transaction