【问题标题】:how to observe new or destroyed assocation in rails如何在 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 的内容,基本上是在添加或删除付款时。

【问题讨论】:

    标签: ruby-on-rails associations rails-activerecord


    【解决方案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 放到信用卡模型中,而是放到支付模型中。然后它会很高兴地告诉您何时创建了新付款......然后您可以检查它是否已添加到信用卡中。不 - 它不完全相同,但正如我所说,它可以重新用于完成大部分您可能需要做的事情......
    • 好的,但我需要保留这个问题,因为我正在直接寻找我的问题的答案。非常感谢您的意见
    猜你喜欢
    • 1970-01-01
    • 2018-07-26
    • 2017-03-14
    • 2012-02-20
    • 1970-01-01
    • 2018-01-06
    • 2020-12-25
    • 1970-01-01
    • 2016-08-13
    相关资源
    最近更新 更多