使用丢弃 gem 软删除 has_and_belongs_to_many 关联

Soft Delete has_and_belongs_to_many association using discard gem

使用丢弃 Gem软删除has_and_belongs_to_many关联的最佳方法是什么。 通过此关联,数据库中有一个连接 table,但在 Rails 模型上没有实际的 Ruby。

我将尝试通过一个例子来解释,假设有 2 个模型:

class Participant < ApplicationRecord
  has_and_belongs_to_many :company_employees
end


class CompanyEmployee < ApplicationRecord
  has_and_belongs_to_many :participants
end

This will create company_employees_participants middle/join table in database BUT without any model in Ruby on Rails. Where i can make settings for discard gem ?

知道如何解决我们需要在加入的 table 中使用 has_and_belongs_to_many assocaition 在丢弃 gem 中进行软删除的需求吗?

丢弃 gem: https://github.com/jhawthorn/discard

我正在使用 ruby 2.5.3,Rails 5.1.6,丢弃(1.0.0)

我认为没有任何 gem 可以软删除 has_and_belongs_to_many 关系。最好的前进方式可能是重构您的关系并使用 has_many :through 使其明确。这允许您自定义关系,例如软删除。更改非常简单:

  1. 创建迁移以重命名连接 table。
  2. 创建一个新模型并匹配 table 的名称。
  3. has_and_belongs_to_many 更改为 has_many :through

然后您可以继续按照丢弃的说明启用软删除。

一般来说,我会尽量避免has_and_belongs_to_many。迟早,我总是不得不自定义连接模型并重构代码。 has_many :through 最初的设置只是稍微多了一些工作,但它在未来会更加灵活,值得付出努力。

你可以看看paranoiagem。 gem 帮助您实现软删除功能。如果你不想使用 gem 那么你可以手动实现它。

如果您想手动集成,更改很简单:

  • 首先,您需要添加迁移以将列deleted_at添加为datetime数据字段类型。

  • 然后你可以像paranoiagem一样编写范围来过滤掉数据,例如with_deleted 您可以在其中查看 deleted_at IS NULL

  • 每当您删除任何记录时,您可以设置 deleted_at.

我在 Whosebug 上找到了一份参考资料,您可以参考一下 How to use paranoia gem in many to many association

希望对您有所帮助