如何根据关联计数准确更改对象属性?

时间:2013-07-31 16:04:22

标签: ruby-on-rails ruby activerecord

我有一个示例课程:

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。我不明白哪些对象被标记为删除,哪些对象是新的,哪些已更新。

2 个答案:

答案 0 :(得分:1)

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

  def check_health
    healthy = true unless diseases.reload.any?
  end

答案 1 :(得分:0)

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

您遇到问题的原因可能是您在人类和疾病的非持久性物体上使用它。

要解决此问题,我认为正确的方法是将before_save回调更改为after_save回调。这将更有意义。此外,它看起来你只需要这个方法以便以后使用保存,所以为什么不这样做呢?