ПредишенСледващото

Активни извика Запис

Това ръководство ще ви научи как да се включат в жизнения цикъл на вашите Активни Запис на обекти.

След като прочетете това ръководство, ще научите:

  • За жизнения цикъл на Активни Запис на обекти
  • Как да създадете извика методи за отговор на събития в жизнения цикъл на обекта
  • Как да създадете собствени класове, които капсулират нормалното поведение за вашите обратни извиквания

1. жизнен цикъл на обекта

В резултат на това, когато нормалните операции по прилагане на релсите, могат да се създават обекти, обновяват и изтриват. Active Record дава възможност да се намесва в жизнения цикъл на даден обект, така че можете да контролирате вашата кандидатура и неговите данни.

Проверки ви позволяват да се гарантира, че само валиден данни се съхраняват в базата данни. Обратни повиквания позволяват да превключвате логиката преди или след промяна на състоянието на обекта.

2. Преглед на обратни извиквания

Обратни повиквания са методи, които се наричат ​​в определени точки в жизнения цикъл на обекта. С обратни повиквания е възможно да се напише код, който ще се проведе, когато Active Record обектът е създаден, поддържан, актуализирани, изтрити или е потвърден се зарежда от базата данни.

2.1. Регистрирайте се извика

За да използвате наличните обратни повиквания, те трябва да се регистрирате. Можете да приложат обратни повиквания като конвенционални методи, а след това използвайте класа макро методите за регистрацията им като обратни повиквания.

методи Macro-клас може също да получават блок. Те могат да бъдат използвани, ако кодът вътре в блока, е толкова кратък, че да пасне на един ред.

Обратни повиквания също могат да бъдат регистрирани за извършване на определени събития от жизнения цикъл:

Добра практика е да обяви за обратно извикване на методи като лични. Ако не е на държавна, те могат да бъдат наречени от външната страна на модела и нарушават принципите на капсулиране съоръжението.

3. Налични обратни извиквания

Ето списък на всички налични Активни Запис обратни извиквания на, изброени в реда, в който те се наричат ​​по време на съответните операции:

3.1. създаване обект

  • before_validation
  • after_validation
  • before_save
  • around_save
  • before_create
  • around_create
  • after_create
  • after_save
  • after_commit / after_rollback

3.2. актуализация обект

  • before_validation
  • after_validation
  • before_save
  • around_save
  • before_update
  • around_update
  • after_update
  • after_save
  • after_commit / after_rollback

3.3. унищожаване на обекта

  • before_destroy
  • around_destroy
  • after_destroy
  • after_commit / after_rollback

after_save започва, когато създавате и актуализиране, но винаги след по-специфичните извика after_create и after_update. независимо от реда, по който те работят макро-разговори.

Before_destroy обаждане трябва да бъде поставен преди връзките зависими. унищожи (или използвайте опцията за прикрепяне: вярно), за да се гарантира, че те са извършени преди записите се изтриват с помощта на зависими. унищожи.

3.4. after_initialize и after_find

After_initialize обаждане е задействана, когато има случай на Active Record обект, или директно с помощта на новото. или когато рекорд се зарежда от базата данни. Тя може да бъде полезно да се избегне необходимостта от пряко замени метод Active Record инициализира.

After_find обаждане ще се нарича, когато Active Record зарежда запис от базата данни. after_find наречен преди after_initialize. ако и двете са дефинирани.

В извика after_initialize и after_find Единична before_ *. но те могат да бъдат регистрирани като всички други Активни Запис обратни повиквания.

3.5. after_touch

After_touch обаждане ще се нарича, когато Active Record обект се нарича докосване.

Може да се използва във връзка с belongs_to:

4. Изпълнете обратни извиквания

Следните методи задействат извика:

Освен това, обратно извикване after_find работи следните методи за търсене:

Обратно повикване after_initialize писти, когато нов обект се инициализира клас.

find_by_ методи * и find_by_ *! Този динамичен методи за търсене генерират автоматично за всеки атрибут. Научете повече те виждат Dynamic търсене

5. Пропускане обратни извиквания

Подобно на валидиране, също така е възможно да пропуснете обратни повиквания с помощта на следните методи.

  • снижаване
  • decrement_counter
  • изтривам
  • delete_all
  • увеличение
  • increment_counter
  • щифт
  • докосване
  • update_column
  • update_columns
  • update_all
  • update_counters

Въпреки това, тези методи трябва да се използват с повишено внимание, тъй като важни правила на бизнеса и логиката на приложението може да се съхранява в обратни повиквания. ги мине без разбиране за възможните последствия може да доведе до невалидни данни.

6. Олово Прекъсване

След като сте се регистрирали нови обратни повиквания в своите модели, те ще бъдат в опашка за изпълнение. Тази опашка съдържа цялата си валидиране на модела, обратни повиквания регистрирани и операции на базата данни, за да се представят.

Цялата верига на обратни извиквания опаковани в експлоатация. Ако някое обаждане хвърля изключение, извършена от веригата се прекъсва и започва ROLLBACK. За умишлено спиране на веригата, да се използва:

Call произволна изключение може да се счупи код, който предполага, че спаси и други подобни няма да се провали по този начин. Изключение ActiveRecord :: намаление на цените малко по-прецизна казва Active Record, че е налице намаление на цените. Той се вдигна от вътрешната страна, но не perevyzyvaet изключение.

Всяко изключение, различна от ActiveRecord :: намаление на цените или ActiveRecord :: RecordInvalid. Rails ще perevyzvano след прекъсване на верига от обратни повиквания. Обадете изключения, различни от ActiveRecord :: намаление на цените или ActiveRecord :: RecordInvalid. може да разбие кода, който не очаква, че методите, като спаси и update_attributes (които обикновено се опитват да се върнат вярно или невярно) ще предизвикат изключение.

7. обратни повиквания за връзки

Обратни повиквания работят с отношенията между модели, а дори могат да бъдат определени от тях. Дайте примери, където потребителят има много статии. Потребителят статия трябва да бъде унищожен, ако потребителят е унищожен. Нека добавим обаждане към модел after_destroy за потребителя чрез отношенията си с модела на член.

8. Селекции обратни извиквания

Както и в потвърждения, може би направи метод на обаждане обаждане е условно, в зависимост от определен предикат. Това се прави с помощта на опциите: ако и: ако не. което може да отнеме символ, Proc или масив. Опция: ако трябва да използвате, за да се определят условията, при които обратното повикване трябва да се нарича. Ако искате да се определят условията, при които обратното повикване не трябва да се наричат, използвайте опцията: освен ако не.

8.1. Използване: ако и: ако не е със символ

Опции: ако и: ако не можете да свържете със символа, съответстващ на името на метод предикат, който ще се нарича непосредствено преди да се обадите на телефонния секретар. Когато използвате опцията: ако. телефонния секретар, няма да бъде изпълнен, ако методът на предикат връща невярна; използвате опцията: освен ако не. телефонния секретар, няма да бъде изпълнен, ако методът на предикат връща истина. Това е най-често срещаният вариант. При използване на тази форма на регистрация, също така е възможно да се регистрират няколко различни предикати, които ще бъдат поканени да се провери дали старт обратно повикване.

8.2. Използване: ако и: освен с Proc

Най-накрая, че е възможно да се сдружават: ако и: освен с Proc на обекта. Този вариант е най-подходящ, когато пишете кратки методи, обикновено една лайнери.

8.3. Съединение условия за обратни повиквания

9. извика класове

Понякога извика методи сте написали достатъчно полезно да се използват отново в други модели. Active Record дава възможност да се създадат класове, включително методи за обратно повикване, така че тя да стане много лесно да ги използва повторно.

Ето един пример, където можете да създадете клас after_destroy PictureFile обратни повиквания за модела:

Ако методът на обаждане е обявена по този начин, не е необходимо да се създаде инстанция на PictureFileCallbacks обекта.

В рамките на своето обаждане клас, можете да създадете произволен брой обратни повиквания.

10. Транзакции извика

Има два допълнителни обаждане, което включва завършване на сделка база данни: after_commit и after_rollback. Тези обратни повиквания са много подобни на after_save на обаждане. освен, че те не започне, докато промените в базата данни няма да бъде потвърдена или конвертирани. Те са най-полезни, когато активното Запишете си модел, трябва да си взаимодействат с външни системи, които не са част от сделка, база данни.

Помислете, например, предишния пример, където моделите PictureFile трябва да изтриете файла, след като записът се унищожават. Ако нещо хвърля изключение след телефонния секретар, се нарича after_destroy. и сделката е отвали, файлът се изтрива и на модела ще остане в състояние на несъвместимост. Например, да предположим, че picture_file_2 следния код не е валиден, а методът спести! ще доведе до грешка.

Използването на обаждане after_commit. можете да помислите този случай.

Опция: по определя кога ще бъде пуснат обратно извикване. Ако не се осигури възможност: на. телефонния секретар, ще бъде пуснат за всяко действие.

Тъй като бяха решили да използват after_commit обаждане само при създаване, актуализиране или изтриване, имат прякори за тези операции:

  • after_create_commit
  • after_update_commit
  • after_destroy_commit

Обратни повиквания after_commit after_rollback и призоваха за всички създадени, актуализира, или изтрити в рамките на блокови сделки модели. Въпреки това, ако има такива изключения се прилага в една от тези обратни повиквания, това изключение ще се появи, както и всички останали методи after_commit или after_rollback не са изпълнени. В действителност, ако Ви обаждане код може да предизвика изключение, е необходимо той да се обади на помощ, както и да се лекува в телефонния секретар, за да може да започне още обаждане.

Когато използвате after_create_commit както и after_update_commit в един и същ модел ще обратно повикване е определено само последния, първостепенни всички останали.

За да се регистрирате обратни повиквания и за двете се създаде, както и за действия за актуализиране, използвайте after_commit.

Подкрепете проекта - споделете линка, благодаря!