Skip to content

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

Closed
@janko

Description

@janko

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions