[Rails] Active Record Callback

資料來(lái)源:Rails Guide

Guide

-回調(diào)和 ActiveRecord 生命周期
-認(rèn)識(shí)回調(diào)方法以及如何使用它們
-在特殊的類中封裝回調(diào)行為

1. Definition

Callback 是掛在 AR 對(duì)象生命周期上的一個(gè)個(gè)小鉤子茬斧。當(dāng)你的 Rails 程序中的每個(gè)對(duì)象被創(chuàng)建徐鹤,更新锦援,刪除闯第,甚至從數(shù)據(jù)庫(kù)載入時(shí)都會(huì)驚動(dòng)這一個(gè)個(gè)小鉤子锚沸。你可以通過控制這些小鉤子處理你想要處理的業(yè)務(wù)邏輯队他,但要提醒一下在鉤子中的邏輯不宜太復(fù)雜急灭,若確實(shí)有大量不可以免的操作辽旋,應(yīng)該寫一個(gè)單獨(dú)的類用來(lái)處理這部分邏輯。

2. Types of Callbacks

2.1. Callbacks when create/update

-before_validation
-after_validation
-before_save
-around_save
-before_create/before_update
-around_create/around_update
-after_create/after_update
-after_save
-after_commit/after_rollback

2.2 Callbacks when destroy

-before_destroy
-around_destroy
-after_destroy
-after_commit/after_rollback

2.3 after_initialize

after_initialize 當(dāng)模型對(duì)象被創(chuàng)建或是從數(shù)據(jù)庫(kù)導(dǎo)入并初始化對(duì)象時(shí)調(diào)用杂拨。
Tips: 使用它可以避免你直接修改 AR 的initialize方法专普。

2.4 after_find

after_find 當(dāng)模型對(duì)象從數(shù)據(jù)庫(kù)獲取記錄,并初始化為對(duì)象時(shí)調(diào)用弹沽。
Tips: after_findafter_initialize之前被調(diào)用檀夹。

2.5 after_touch

after_touch 該回調(diào)發(fā)生在一個(gè)模型對(duì)象記錄被觸摸時(shí)。
觸摸表示更新 updated_at字段贷币,使用touch方法可以手動(dòng)完成記錄的觸摸击胜。

3. Running and Skipping Callbacks

-(1) 產(chǎn)生回調(diào)
create, update, update_attribute, update_attributes, destroy, destroy_all,
save, save(validate: false), valid?, increment!, decrement!, toggle!
after_find: all, first, find, find_by, find_by_sql, last

-(2) 跳過回調(diào):
touch, toggle, increment, decrement, increment_counter, decrement_counter,
update_counters, update_column, update_columns, update_all, delete, delete_all

4. Halting Execution

你所添加的回調(diào)函數(shù)會(huì)自動(dòng)排成一個(gè)隊(duì)列等待被執(zhí)行,這個(gè)隊(duì)列包括開頭的驗(yàn)證役纹,之后的回調(diào)偶摔,以及最后的數(shù)據(jù)庫(kù)操作指令。該隊(duì)列被包裹在一層事務(wù)中促脉,如果任何一個(gè)回調(diào)函數(shù)出錯(cuò) (throw(:abort)或拋出異常辰斋,注意這里不包括返回false),該鏈條的執(zhí)行終止瘸味,并且向前回滾到最初的狀態(tài)宫仗。
Tips: after_commit/after_rollback 發(fā)生在數(shù)據(jù)庫(kù)操作之后,所以這里出錯(cuò)將會(huì)被無(wú)視

5. Conditional Callbacks

使用:if, :unless來(lái)增加條件判斷回調(diào)是否要執(zhí)行.

6. Callback Classes

創(chuàng)建類來(lái)封裝回調(diào)方法從而增加代碼的可讀性

7. Transaction Callbacks

after_commit/after_rollback 是在數(shù)據(jù)庫(kù)操作完成之后才被觸發(fā)的旁仿。他們最佳的適用場(chǎng)景是在與別的外部系統(tǒng)交互時(shí)藕夫,操作無(wú)法成為數(shù)據(jù)庫(kù)事務(wù)的一部分的時(shí)候。
如果你想完成刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)并且刪除硬盤上的相關(guān)文件操作時(shí)枯冈,
最好使用 after_commit :delete_file_from_disk, on: :destroy
而不是 after_destroy :delete_file_from_disk
after_create_commit 等于 after_commit ... on: :create
after_update_commit 等于 after_commit ... on: :update
after_destroy_commit 等于 after_commit ... on: :destroy

相關(guān)零碎知識(shí)點(diǎn):

  1. 可以在一個(gè) callback 中定義多個(gè)方法毅贮,方法排列的次序就是方法執(zhí)行的次序。
    e.g. before_save :first, :second, :third # 執(zhí)行順序 :first, :second, :third
  2. 每當(dāng)create/update時(shí)尘奏,屬性的改變都會(huì)存在attr_changed? == true
    創(chuàng)建一條新的記錄滩褥,在回調(diào)中attr_changed=trueattr_was=nil炫加,attr=當(dāng)前值瑰煎;
    更新一條記錄,在回調(diào)中attr_changed=true俗孝,attr_was=之前的值酒甸,attr=當(dāng)前值.
    Note: attr_changed?true 是發(fā)生在你改變了這個(gè)記錄的值卻沒有存入數(shù)據(jù)庫(kù)的時(shí)候,另外創(chuàng)建記錄時(shí)只要和默認(rèn)值不一致都會(huì)返回 true赋铝。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末插勤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饮六,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苛蒲,死亡現(xiàn)場(chǎng)離奇詭異卤橄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)臂外,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門窟扑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人漏健,你說我怎么就攤上這事嚎货。” “怎么了蔫浆?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵殖属,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我瓦盛,道長(zhǎng)洗显,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任原环,我火速辦了婚禮挠唆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘱吗。我一直安慰自己玄组,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布谒麦。 她就那樣靜靜地躺著俄讹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弄匕。 梳的紋絲不亂的頭發(fā)上颅悉,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音迁匠,去河邊找鬼剩瓶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛城丧,可吹牛的內(nèi)容都是我干的延曙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼亡哄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼枝缔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤愿卸,失蹤者是張志新(化名)和其女友劉穎灵临,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趴荸,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡儒溉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了发钝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顿涣。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酝豪,靈堂內(nèi)的尸體忽然破棺而出涛碑,到底是詐尸還是另有隱情,我是刑警寧澤孵淘,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布蒲障,位于F島的核電站,受9級(jí)特大地震影響夺英,放射性物質(zhì)發(fā)生泄漏晌涕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一痛悯、第九天 我趴在偏房一處隱蔽的房頂上張望余黎。 院中可真熱鬧,春花似錦载萌、人聲如沸惧财。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)垮衷。三九已至,卻和暖如春乖坠,著一層夾襖步出監(jiān)牢的瞬間搀突,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工熊泵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仰迁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓顽分,卻偏偏與公主長(zhǎng)得像徐许,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卒蘸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 因?yàn)樵奶L(zhǎng)超出字?jǐn)?shù)雌隅,Lesson 3 就放在另一篇文章里 How to Use Git and GitHub 標(biāo)...
    赤樂君閱讀 5,222評(píng)論 1 5
  • 一、心得體會(huì)1、今天完成了什么恰起? Rails guide 4 170頁(yè) 5個(gè)小時(shí) 重看了鎬頭書看了第一部分 1個(gè)小...
    柳輝閱讀 361評(píng)論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法修械,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法检盼,繼承相關(guān)的語(yǔ)法祠肥,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,644評(píng)論 18 399
  • Awesome Ruby Toolbox Awesome A collection of awesome Ruby...
    debbbbie閱讀 2,879評(píng)論 0 3
  • 1. 安裝mongoid 在Rails 配置文件Gemfile中梯皿,做如下配置 2. 配置文件 執(zhí)行 rails g...
    AQ王浩閱讀 3,686評(píng)論 1 7