2016-01-15 75 views
0

我有這個模型,LeaveManagementRule。 A Rulesenderreceiver。發送者可以是一個RoleUser(同樣爲接收器):Rails雙重多態依賴:銷燬沒有正確銷燬

class LeaveManagementRule < ActiveRecord::Base 

    belongs_to :sender, polymorphic: true # Sender can be a Role or a User 
    belongs_to :receiver , polymorphic: true # receiver can be a Role or a User 
    ... 
end 

這裏是User模型:

class User < ActiveRecord::Base 
    has_many :leave_management_rules, as: :sender, dependent: :destroy 
    has_many :leave_management_rules, as: :receiver, dependent: :destroy 
    ... 
end 

Role模型是相同的用戶模型。爲了這個問題的目的,我不覺得需要詳細說明。

這裏是leave_management_rules表的數據庫的摘錄:

mysql> select * from leave_management_rules; 
+----+-----------+-------------+--------+-------------+---------------+------------+ 
| id | sender_id | sender_type | action | receiver_id | receiver_type | project_id | 
+----+-----------+-------------+--------+-------------+---------------+------------+ 
| 1 |  56 | User  |  1 |   19 | Role   |   33 | 
| 2 |  146 | User  |  2 |   56 | User   |   33 | 
+----+-----------+-------------+--------+-------------+---------------+------------+ 

我們將專注於user_id: 56,它出現在兩個項目在這裏(作爲sender入境1,作爲receiver爲條目2)。現在

,我試圖刪除用戶56我的Rails控制檯:

irb(main):020:0> u = User.find(56) 
irb(main):021:0> u.destroy 

所以,我希望我的leave_management_rules表,現在是空的。但還有一個條目:

mysql> select * from leave_management_rules; 
+----+-----------+-------------+--------+-------------+---------------+------------+ 
| id | sender_id | sender_type | action | receiver_id | receiver_type | project_id | 
+----+-----------+-------------+--------+-------------+---------------+------------+ 
| 1 |  56 | User  |  1 |   19 | Role   |   33 | 
+----+-----------+-------------+--------+-------------+---------------+------------+ 

有沒有什麼我在做我的代碼錯了?

我正在Rails 4.2.4

回答

0

我沒有找到答案,爲什麼dependent: :destroy回調不能正確觸發。

相反,我寫了一個自定義的before_destroy回調的UserRole型號:

before_destroy :destroy_leave_management_rules 

def destroy_leave_management_rules 
    as_sender = LeaveManagementRule.where(sender: self) 
    as_receiver = LeaveManagementRule.where(receiver: self) 
    as_sender.destroy_all 
    as_receiver.destroy_all 
end 
0

我認爲你沒有做很好的double-polimymorphic關聯。嘗試這樣的事情:

class UserRulesRelation < ActiveRecord::Base 
    belongs_to :origin, polymorphic: true 
    belongs_to :leave_management_rules, polymorphic: true 
end 

class User < ActiveRecord::Base 
    has_many :user_rules_relations, as: :origin, dependent: :destroy 

    has_many :sent, through: :user_rules_relations, source: :leave_management_rules, source_type: "User" 
    has_many :received, through: :user_rules_relations, source: :leave_management_rules, source_type: "LeaveManagementRule" 
end 

class LeaveManagementRule < ActiveRecord::Base 
    has_many :user_rules_relations, as: :origin, dependent: :destroy 

    has_many :sent, through: :user_rules_relations, source: :leave_management_rules, source_type: "User" 
    has_many :received, through: :user_rules_relations, source: :leave_management_rules, source_type: "LeaveManagementRule" 
end 
+0

謝謝你這些細節,不幸的是,我不認爲我會反應堆我的整個代碼結構,我有近完成了它的發展和幾個模型取決於它。它工作得很好,從依賴appart:消滅回調只被調用一次。我想我會調用before_destroy上的自定義方法來手動觸發預期的過程... – ste26054