2012-05-04 68 views
4

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

我想是这样的:

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

我想用Company#users方式如下:

  • Company#users应该是一个正常的协会,使其与形式工程和不破坏现有合同。
  • 当向公司添加用户时,新的Staffingactive: true创建的
  • 从公司取出用户,现有Staffing更新active: false(目前只是被删除)。
  • 以前删除的用户添加到公司(以便Staffing#active == falseStaffing更新为active: true

我想过重写Company#users=方法,但它确实不够好,因为还有其他更新关联的方法。

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

谢谢。

回答

4

has_many :through关联实际上只是语法糖。当你需要举重时,我会建议分解逻辑并提供适当的方法和范围。了解如何覆盖callbacks对于这类事情也很有用。

这将帮助您开始使用软删除对User和创造Staffings一个User

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 
+0

后,我很清楚的回调和所有的。我不认为你已经读过这个问题。我如何按照我描述的方式使用“公司#用户”? –

+1

您的四个用例中的哪一个我的答案没有提供解决方案?您可以保留'公司'定义,并添加'after_create'回调和重写的'destroy'方法,并且您提到的所有功能都应该被考虑。也许对你打算如何使用'公司#用户'的说明会有所帮助,因为你实际上没有解释你打算如何使用'公司#用户',只需要满足四个合同。 – TCopple

+0

我已经更新了一下这个问题。请花时间阅读它。 –

相关问题