2013-04-25 57 views
7

有沒有辦法來跳過更新協會與:touch協會保存時?跳繩:觸摸協會保存一個ActiveRecord對象時

設置:

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回調。

+1

所以你平時想觸摸,但有時跳過觸摸? – AlexBrand 2013-04-25 18:12:58

+0

確實如此。基本上我有一種情況,我正在更新所有觸摸相同關係的多個模型。我想在這種情況下避免碰觸。 – 2013-04-25 18:14:06

回答

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。

+0

「belongs_to_touch_after_save_or_destroy_for_school」的定義在哪裏? – 2014-10-20 03:35:48

+0

它由'belongs_to'函數定義。取決於你的Rails版本,你可以在'activerecord-3.2.19/lib/active_record/associations/builder/belongs_to.rb:51'這樣的地方找到它。 – 2014-10-20 16:29:07

1

不幸的是,沒有。 save不提供這樣的選項。

解決此問題的方法是使用另一個時間戳屬性,其功能類似於updated_at,但與updated_at不同,它僅在某些情況下根據自己的喜好更新。直接避免猴子修補

0

鐵軌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