Rails 模型中的条件回调?

Posted

技术标签:

【中文标题】Rails 模型中的条件回调?【英文标题】:Conditional Callback in Rails' model? 【发布时间】:2012-02-11 00:03:45 【问题描述】:

只是想知道是否有办法在 Rails 中进行条件回调。我知道您可以像这样进行条件验证:

validates_uniqueness_of :email, :if => (1==1)

我经常在回调中做这样的事情:

class LineItem < ActiveRecord::Base
  belongs_to :invoice
  belongs_to :line_item_group

  before_create :set_invoice_id
  def set_invoice_id
    unless self.invoice_id
      self.invoice_id = self.line_item_group.invoice_id
    end
  end
end

稍微清理一下就好了。

【问题讨论】:

【参考方案1】:
class LineItem < ActiveRecord::Base
  before_create :set_invoice_id, unless: :invoice_id

  def set_invoice_id
    self.invoice_id = line_item_group.invoice_id
  end
end

【讨论】:

你说得对,它不是正统的 SQL,我喜欢这样。 :) 我愿意为了更少的加入而牺牲常态。【参考方案2】:

是的,你可以。

class Order < ActiveRecord::Base
  before_save :normalize_card_number, :if => :paid_with_card?
end

有关此主题的更多信息,请参阅http://guides.rubyonrails.org/active_record_callbacks.html#conditional-callbacks。

【讨论】:

我认为OP想要重构第二个sn-p,但问题还不清楚...... 如我所料。主要是想把这个贴在这里记录一下。

以上是关于Rails 模型中的条件回调?的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 在before_destroy回调时取消销毁

Rails:更新模型属性而不调用回调

如何保存模型,而在Rails的运行回调

Rails Rspec / Factory Bot没有调用模型before_save回调

Rails - 如何从after_save回调中查看旧模型值和新模型值?

什么时候在 Rails 回调链中分配 Postgres 中的默认值?