1

我有一个示例类:

class Human < ActiveRecord::Base
  has_and_belongs_to_many :diseases
  before_save :check_health

  def check_health
    if(diseases.count == 0)
      self.healthy = true
    end
  end
end

我想在保存之前更改对象的字段。

问题:

  • self.diseases返回关联的旧值diseases

  • 的新值:diseases可以通过 访问association_cache[:diseases],但我不知道如何使用association_cache。我不明白哪些对象被标记为删除,哪些对象是新的,哪些已经更新。

4

2 回答 2

1

为什么不重新加载关系对象以获得准确的计数?尝试这个:

  def check_health
    healthy = true unless diseases.reload.any?
  end
于 2013-07-31T16:06:55.673 回答
0

起初我认为里面的逻辑#check_health是完全正确的。无需更改它。

您遇到问题的原因可能是您将它用于非持久性对象,包括人类和疾病。

要解决它,我认为正确的做法是将回调更改before_saveafter_save回调。这将更有意义。而且看起来您只需要保存后使用此方法,那么为什么不这样做呢?

于 2013-07-31T18:05:12.347 回答