每次向父對象添加子對象(has_many關聯)時,我都想運行before_save
或after_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_save
與update
),但我的印象是,使用Active Record的order
方法,如果可能的話,在效率和最佳實踐方面最好。有沒有辦法在before_save
的Active Record中做到這一點,或者有什麼可能是最好的做法呢?看起來好像會出現很多,但我很難找到適合我的解決方案,所以我覺得我一定在想它是錯的。謝謝!
這是有道理的,把它放在孩子(課程)。我有點兒希望把邏輯放在父母(同齡人)中,因爲這主要與同齡人有關,因爲並非所有的課程都有同齡人。但是,如果父母沒有乾淨的方式去做,我當然可以把它放在孩子身上。謝謝! – Zam
如果課程可以在沒有隊列的情況下存在,回調將需要檢查。更新了我的答案,以在嘗試更新之前檢查隊列是否存在。 –