2016-01-15 121 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