4

通过关联在 has_many 上实现软删除的最简单方法是什么?

我想要的是这样的:

class Company > ActiveRecord::Base
  has_many :staffings
  has_many :users, through: :staffings, conditions: {staffings: {active: true}}
end

我想使用Company#users以下方式:

  • 应该是一个正常的Company#users关联,以便它与表单一起使用并且不会破坏现有的合同。
  • 用户添加到公司时,会创建一个新Staffing的 with 。active: true
  • 当从公司中删除用户时,现有的Staffing会被更新active: false(目前它只是被删除)。
  • 以前删除的用户添加到公司时(以便Staffing#active == falseStaffing更新为active: true.

我考虑过覆盖该Company#users=方法,但它确实不够好,因为还有其他更新关联的方法。

所以问题是:如何实现对Company#users关联的解释行为?

谢谢。

4

1 回答 1

4

has_many :through关联实际上只是语法糖。当您需要进行繁重的工作时,我建议您拆分逻辑并提供适当的方法和范围。了解如何覆盖回调对于这类事情也很有用。

这将使您开始使用软删除并在之后User创建StaffingsUser

class Company < ActiveRecord::Base
  has_many :staffings
  has_many :users, through: :staffings, conditions: ['staffings.active = ?', true]
end

class Staffing < ActiveRecord::Base
  belongs_to :company
  has_one :user
end

class User < ActiveRecord::Base
  belongs_to :staffing

  # after callback fires, create a staffing
  after_create {|user| user.create_staffing(active: true)}

  # override the destroy method since you 
  # don't actually want to destroy the User
  def destroy
    run_callbacks :delete do
      self.staffing.active = false if self.staffing
    end
  end
end
于 2012-05-04T05:27:25.163 回答