跳过:保存ActiveRecord对象时触摸关联

时间:2013-04-25 18:00:41

标签: ruby-on-rails ruby activerecord

保存时,有没有办法跳过更新与:touch关联的关联?

设定:

class School < ActiveRecord::Base
  has_many :students
end

class Student < ActiveRecord::Base
  belongs_to :school, touch: true
end

我希望能够执行以下跳过触摸的操作。

@school = School.create
@student = Student.create(school_id: @school.id)
@student.name = "Trevor"
@student.save # Can I do this without touching the @school record?
你能做到吗?像@student.save(skip_touch: true)这样的东西会很棒,但我没有找到类似的东西。

我不想使用类似update_column的内容,因为我不想跳过AR回调。

3 个答案:

答案 0 :(得分:2)

避免直接猴子修补的一个选项是覆盖与:touch属性建立关系时创建的方法。

鉴于OP的设置:

class Student < ActiveRecord::Base
  belongs_to :school, touch: true

  attr_accessor :skip_touch

  def belongs_to_touch_after_save_or_destroy_for_school
    super unless skip_touch
  end

  after_commit :reset_skip_touch

  def reset_skip_touch
    skip_touch = false
  end
end

@student.skip_touch = true
@student.save # touch will be skipped for this save

这显然非常hacky,取决于AR中真正具体的内部实现细节。

答案 1 :(得分:2)

从Rails v4.1.0.beta1开始,正确的方法是:

@school = School.create
@student = Student.create(school_id: @school.id)

ActiveRecord::Base.no_touching do
  @student.name = "Trevor"
  @student.save
end

答案 2 :(得分:1)

不幸的是,没有。 save没有提供此类选项。

解决这个问题的方法是使用另一个时间戳属性,其功能类似于updated_at,但与updated_at不同,它仅在某些情况下根据您的喜好进行更新。