加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 当以另一种方式创建记录时,Rails Association

发布时间:2020-12-17 07:08:32 所属栏目:百科 来源:网络整理
导读:这是我的用户模型及其订阅: # 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/subsc
这是我的用户模型及其订阅:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读