2017-06-07 108 views
0

每次向父對象添加子對象(has_many關聯)時,我都想運行before_saveafter_add回調。在回調中,我想根據所有孩子(課程)的end_date屬性在父代(隊列)上設置end_date屬性。has_many關聯的活動記錄回調

class Cohort < ActiveRecord::Base 
    has_many :courses 
    before_save :update_end_date 

    def update_end_date 
    self.end_date = courses.order(:end_date).last.try(:end_date) 
    end 
end 

我遇到的問題是,該課程還沒有保存到數據庫中before_save回調,所以courses.order(:end_date)不會返回新添加的過程(一個或多個)。

有幾種解決方法,我可以使用(例如,使用Ruby courses.sort_by方法或使用after_saveupdate),但我的印象是,使用Active Record的order方法,如果可能的話,在效率和最佳實踐方面最好。有沒有辦法在before_save的Active Record中做到這一點,或者有什麼可能是最好的做法呢?看起來好像會出現很多,但我很難找到適合我的解決方案,所以我覺得我一定在想它是錯的。謝謝!

回答

0

如果課程的結束日期晚於人羣結束日期,那麼您可以在保存可能更新人羣的課程後進行保存。以及課程後的摧毀,這告訴隊列更新其結束日期,以符合剩餘的課程。

class Course < ActiveRecord::Base 
    belongs_to :cohort 
    after_save :maybe_update_cohort_end_date 
    after_destroy :update_cohort_end_date 

    def maybe_update_cohort_end_date 
    if cohort && self.end_date > cohort.end_date 
     cohort.end_date = self.end_date 
     cohort.save 
    end 
    end 

    def update_cohort_end_date 
    cohort.update_end_date if cohort 
    end 
end 

class Cohort < ActiveRecord::Base 
    has_many :courses 

    def update_end_date 
    self.end_date = courses.order(:end_date).last.try(:end_date) 
    end 
end 

這樣您只有在新的或更新的課程結束日期會更改人羣結束日期時才進行更新。但也捕捉,如果課程被刪除,然後檢查結束日期應該是

+0

這是有道理的,把它放在孩子(課程)。我有點兒希望把邏輯放在父母(同齡人)中,因爲這主要與同齡人有關,因爲並非所有的課程都有同齡人。但是,如果父母沒有乾淨的方式去做,我當然可以把它放在孩子身上。謝謝! – Zam

+0

如果課程可以在沒有隊列的情況下存在,回調將需要檢查。更新了我的答案,以在嘗試更新之前檢查隊列是否存在。 –

相關問題