2012-05-04 69 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

我已經更新了一下這個問題。請花時間閱讀它。 –

相關問題