8

有没有办法在保存时跳过更新与关联的: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 回调。

4

3 回答 3

5

从 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
于 2017-10-23T19:47:07.840 回答
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

这显然很老套,并且取决于 AR 中真正具体的内部实现细节。

于 2013-04-25T18:26:58.803 回答
1

抱歉不行。save不提供这样的选项。

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

于 2013-04-25T18:15:18.130 回答