如何在 Rails 中观察新的或破坏的关联

Posted

技术标签:

【中文标题】如何在 Rails 中观察新的或破坏的关联【英文标题】:how to observe new or destroyed assocation in rails 【发布时间】:2014-11-18 21:53:16 【问题描述】:

我知道有 after_add 和 after_remove 关联回调,您可以在定义 Rails 中的关联时使用,如此处“关联回调”部分所述 - http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

但是我使用的 gem 已经像这样定义了关联:

has_many :payments, as: :source

我尝试使用 class_eval 或 ActiveSupport::Concern 来覆盖关联,因此它看起来像这样:

has_many :payments, as: :source, after_add: :payment_added, after_remove: :payment_removed

但这对我不起作用(如果您认为应该让我知道)

因此,与其尝试覆盖它,我想知道是否有任何其他方法可以观察类似于 after_remove 和 after_add 的内容,基本上是在添加或删除付款时。

【问题讨论】:

【参考方案1】:

回调不必在关联定义行中定义。它们可以随时添加到关联对象中 - 特别是如果它们仅添加到此关联对象中。

这是docs on callbacks here的链接

要替换您的 after_add 回调,您需要的是 after_create 回调。和你的after_remove 你可以使用after_destroy

例如:

has_many :payments, as: :source

在付款方面:

after_create :payment_added
after_destroy :payment_removed

现在 - 您已将其移至子对象中,您可能需要调整逻辑以调用父对象上的方法...此外,如果这些付款可以添加到主对象以外的其他对象中,则可能不工作,但这是一种选择。

【讨论】:

它们略有不同,但如果需要,您仍然可以(可能)将它们重新用于您的用途。 这是行不通的,因为对于现有的信用卡,如果新的付款已添加到信用卡付款列表中,则不会调用 after_create。只有在创建了新信用卡时才会调用此处的创建后。如果新的付款已添加到已付款的信用卡列表中,我希望收到通知 啊不-也许我不够清楚。我不是要把 after_create 放到信用卡模型中,而是放到支付模型中。然后它会很高兴地告诉您何时创建了新付款......然后您可以检查它是否已添加到信用卡中。不 - 它不完全相同,但正如我所说,它可以重新用于完成大部分您可能需要做的事情...... 好的,但我需要保留这个问题,因为我正在直接寻找我的问题的答案。非常感谢您的意见

以上是关于如何在 Rails 中观察新的或破坏的关联的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4 在保存时创建关联对象

Rails多态命名边缘情况

如何在 Rails 中使用插入所有方法,包括关联?

在 Rails 中,如何在一个查找器中查询两个 has_many 关联?

如何在整个 Rails 活动记录关联链中取消特定模型的默认范围?

如何在 Rails 中使用 Cloudinary 将直接上传字段与模型相关联?