ruby-on-rails – 当以另一种方式创建记录时,Rails Association
这是我的用户模型及其订阅:
# app/models/user.rb class User < ActiveRecord::Base has_many :subscriptions,:before_add => :cancel_subscriptions! def cancel_subscriptions!(new_subscription=nil) subscriptions.each(&:cancel!) end end # app/models/subscription.rb class Subscription < ActiveRecord::Base belongs_to :user end 所以,当我做some_user.subscriptions.create时,它会执行:cancel_subscriptions!回调然后我很高兴.但后来我做了Subscription.create:user => some_user回调似乎没有被调用,我感到难过,非常非常伤心. 有没有办法确保在创建与用户关联的订阅时执行回调? PD:我真的不想在我的订阅模型中写一个:before_create,因为我认为取消所有订阅应该是用户模型的责任. 解决方法
从技术上讲,属于:belongs_to的inverse_of选项应该处理这种情况.具体来说,让关联的另一方知道这方面的变化.但这只适用于另一方是has_one的情况.从文档中不清楚,但你可以
see it the source.
所以截至目前,没有办法让它自动运行. 有关PD的说明:您确实希望将订阅功能从用户模型中移除.在User模型中管理订阅会增加耦合.正如您拥有Subscription模型一样,它可以让它完成工作并管理单个用户的订阅.此外,before_add不是管理订阅的好地方.您正在执行hook_that中的破坏性操作,该hook_that在保存任何资源之前运行.也就是说,您可以取消所有订阅,并且您的新订阅未通过验证.因此,您丢失了旧订阅(您之前不知道哪一个是活动的)并且您有无效的新订阅无法保存. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |