这是我的用户模型及其订阅:
# 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在保存任何资源之前运行.也就是说,您可以取消所有订阅,并且您的新订阅未通过验证.因此,您丢失了旧订阅(您之前不知道哪一个是活动的)并且您有无效的新订阅无法保存.