Closed
Description
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