如何在 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 中,如何在一个查找器中查询两个 has_many 关联?