# app/models/user.rbclass User < ActiveRecord::Base has_many :subscriptions,:before_add => :cancel_subscriptions! def cancel_subscriptions!(new_subscription=nil) subscriptions.each(&:cancel!) endend# app/models/subscription.rbclass Subscription < ActiveRecord::Base belongs_to :userend
所以,当我做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在保存任何资源之前运行.也就是说,您可以取消所有订阅,并且您的新订阅未通过验证.因此,您丢失了旧订阅(您之前不知道哪一个是活动的)并且您有无效的新订阅无法保存.
总结以上是内存溢出为你收集整理的ruby-on-rails – 当以另一种方式创建记录时,Rails Association Callbacks没有运行全部内容,希望文章能够帮你解决ruby-on-rails – 当以另一种方式创建记录时,Rails Association Callbacks没有运行所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)