ActiveRecord запытвае і вы: як знайсці () правільны метад для працы

Фота агенцтва Olloweb на Unsplash

Калі вы як-небудзь падобны на мяне, то ваш досвед, калі вы ўпершыню даведаліся пра базы дадзеных як новага праграміста, былі чымсьці дзіўным вопытам. Раптам перад вамі былі высветлены складаныя ўнутраныя працы Інтэрнэту - гэта табліцы і асацыяцыі.

Калі вы таксама што-небудзь падобнае на мяне, калі гаворка ідзе пра вывучэнне SQL і пра тое, як на самай справе ўзаемадзейнічаць з гэтымі базамі дадзеных, вашыя першыя ўражанні там, хутчэй за ўсё, былі нейкі грубы званок па абуджэнні з вашага раней выкліканага задумы. Раптам вы разумееце, што для кожнай базы дадзеных, якая захоўвае велізарную колькасць інфармацыі, павінен быць чалавек, які ведае, як перамагчы гэты чорт, каб атрымаць гэтую інфармацыю з яго. І вы напэўна зразумелі, што канкрэтным кім-небудзь рана ці позна станеце вы.

На шчасце, сучасныя рамкі праграмавання далі нам зручныя і зразумелыя спосабы стварэння, захоўвання і атрымання дадзеных. Сёння мы будзем гаварыць пра адну канкрэтную аснову - Ruby on Rails - і пра адзін яе канкрэтны аспект, які прымушае кіраванне базай дадзеных вецер - ActiveRecord.

Rails і ActiveRecord добра дакументаваны ў Інтэрнэце, таму я зараз пакіну больш глыбокі аналіз іншым, больш мудрым людзям. Сёння я збіраюся закрануць адзін аспект, у прыватнасці, які мяне выклікаў пры першым вывучэнні асноў, каб іншыя студэнты маглі пазбегнуць тых жа падводных камянёў: запыты да базы дадзеных.

У прыкладанні Rails вашыя мадэлі, кантролеры і погляды аб'ядноўваюць намаганні, каб зрабіць выдатную працу па захаванні рэчаў у вашай базе дадзеных, але ў канчатковым выніку вам прыйдзецца выцягваць гэтыя асобнікі інфармацыі, каб зрабіць нейкую логіку на іх, альбо проста паказаць іх. Вось тады запыты ўступаюць у гульню. Запыты ў ActiveRecord - гэта, па сутнасці, каманды SQL, загорнутыя ў цёплую коўдру чытэльнага сінтаксісу Ruby, які дазваляе пісаць, што дазваляе больш думаць пра тое, што вы збіраецеся рабіць з гэтымі дадзенымі, а не думаць пра тое, як атрымаць іх у першую чаргу.

Існуе мноства канкрэтных метадаў запытаў, якія існуюць для любой мэты, і пра іх можна прачытаць у афіцыйнай дакументацыі па Rails, але сёння я закрану тры найбольш распаўсюджаныя і адрозненні паміж імі, а таксама некалькі падобных метадаў, звязаных з прыкладамі кантэкстнага кода:

  1. .find ()
  2. .find_by ()
  3. дзе-небудзь ()

.find ()

find () - мабыць, самы просты спосаб запыту з усіх, але тым не менш магутны. Дазваляе атрымаць адзіны аб'ект з вашай базы дадзеных, які тычыцца асноўнага ключа (ID), які вы перадаеце ў якасці аргумента. Дапусцім, вы стварылі клас, які прадстаўляе госця ў токавым шоу позняй ночы:

Пасля таго, як кожны асобнік госця захоўваецца пасля яго стварэння, яму прадастаўляецца першасны ключ альбо ідэнтыфікатар у базе дадзеных. Каб у будучыні атрымаць гэты гасцявы асобнік, вы проста запоўніце файл find () на госцевым класе (захаваўшы яго, напрыклад, для зменнай):

Які верне гэты экзэмпляр класа гасцей пры выкліку:

Эквівалент SQL, які працуе пад капотам для метаду find () вышэй:

Можа здацца, што метад find () занадта канкрэтны - у рэшце рэшт, як часта вы дакладна будзеце ведаць, што ідэнтыфікатар асобніка аб'екта ў вашай базе дадзеных? Дзіўна, але вы атрымаеце доступ да ідэнтыфікатараў часцей, чым вы думаеце, асабліва пры выкарыстанні параметраў HTTP у Rails. Але ўсё ж гэта сапраўды служыць вельмі канкрэтнай мэты.

Варта адзначыць, што вы можаце вярнуць некалькі асобнікаў, перадаўшы масіў першасных ключоў у якасці аргументу:

Што-небудзь падобнае можна зрабіць, скарыстаўшыся:

. прыняць

які прымае лік як аргумент і здабывае такую ​​колькасць экземпляраў класа ў парадку ўзрастання.

Да аналагічных уцёкаў find () адносяцца:

.першае і .пазней

якія здабываюць самыя раннія і апошнія створаныя асобнікі класа адпаведна. Ім можна даць лічбы ў якасці аргументаў, вяртаючы гэтыя мноства асобнікаў класа ў парадку ўзыходзячага ці памяншальнага.

Гэта прывядзе нас да нашага наступнага і больш універсальнага метаду запыту: find_by ()

.find_by ()

На першы погляд .find_by () можа здацца знаёмым, але знаёмствы хутка заканчваюцца. Як і .find (), .find_by () няяўна вяртае толькі адзін аб'ект класа, але адрознівае сябе, дазваляючы шукаць іншыя атрыбуты, акрамя першаснага ключа, і дазваляе адначасова шукаць больш аднаго атрыбута. Напрыклад, вы можаце знайсці госця, шукаючы яго імя:

Эквівалентны SQL тут:

Цудоўна, мы атрымалі аб'ект назад! Але пачакайце, гэта Майкл Дж. Фокс, акцёр, і мы хацелі знайсці астранаўта Майкла Дж. Фокса! (заўвага: гэта толькі прыклад, я не магу ні пацвердзіць, ні абвергнуць існаванне касманаўта па імі Майкл Дж. Фокс.)

Каб знайсці гэты асобнік, мы маглі б вызначыць далей:

Ура! Дзякуючы нашай магчымасці наладзіць пошук, мы знайшлі правільны асобнік класа госцей. Гэта сіла .find_by (). Вы можаце тэарэтычна шукаць столькі атрыбутаў класа, колькі вы хацелі, каб звузіць пошук.

Вы таксама можаце выкарыстоўваць .find_by (), каб знайсці пэўныя класы сталярных праграм у вашых дадатках, што з'яўляецца вельмі універсальным інструментам для стварэння метадаў класа. Дапусцім, госць з'явіўся ў пэўным эпізодзе ток-шоу, і вы хацелі знайсці інфармацыю, звязаную з гэтым з'яўленнем. Калі наш клас знешняга выгляду існуе як такі:

Вы можаце выкарыстоўваць .find_by (), каб знайсці гэты спецыфічны экзэмпляр даволі лёгка і ўставіць гэтую логіку ў любым месцы. Давайце выкарыстаем яго як метад класа для госця:

Пры выкарыстанні ў якасці аргумента госці і пры ўмове аргумента экзэмпляра эпізода гэта вяртае асобнік гэтага канкрэтнага выгляду. Дзіўна!

"Але", можна сказаць, "што рабіць, калі я хацеў знайсці некалькі асобнікаў класа? Што рабіць, калі я хацеў знайсці кожны асобнік акцёра Майкла Дж. Фокса і касманаўта Майкла Дж. Фокса? "

Я рады, што вы спыталі, бо менавіта тут ідзе наступны наш апошні метад: .where ()

дзе-небудзь ()

З трох асноўных метадаў запыту, якія мы закранаем у гэтым пасце, .where (), магчыма, самы універсальны, але таксама самы складаны і прасцей за ўсё заблытацца.

У той час як .find () і .find_by () вяртаюць адзінкавыя асобнікі аб'екта, .where () вяртае тое, што называецца "ActiveRecord :: аб'ект адносіны", па сутнасці масіў асобнікаў з даданай дадатковай інфармацыяй. У выніку, выкарыстанне .where () таксама запатрабуе дадатковых прамежкавых ведаў па працы з масівамі укладзенай інфармацыі.

Дзе-небудзь () варта разглядаць як метад "Умова", ён жа дазваляе вам кантраляваць, якія аб'екты вяртаюцца, усталяваўшы, якія "ўмовы" прачэсваць праз вашу базу дадзеных, і абмежаваць тое, што вяртаецца. Я яшчэ раз заклікаю прачытаць дакументацыю Rails на ўмовы для больш складаных тэм, але я закрану асноўныя выпадкі выкарыстання, якія вам, хутчэй за ўсё, спатрэбяцца.

Вы можаце выпісаць сінтаксіс запыту .where () аналагічна нашым папярэднім прыкладам, каб знайсці ЎСЕ асобнікі гасцей з імем Майкл Дж. Фокс:

Нічога сабе, цяпер іх яшчэ больш! У нас ёсць жывапісец Майкл Дж. Фокс, і музыка Майкл Дж. Фокс. З дапамогай аднаго простага метаду мы атрымалі масіў кожнага госця пад такім імем - які магутны інструмент!

Вось дзе ўсё становіцца цікавей. Калі вы хочаце перадаць некалькі ўмоў для запыту .where (), сінтаксіс зменіцца на нешта менш звыклае.

Калі б было некалькі асобнікаў акцёраў па імі Майкл Дж. Фокс, вы можаце задаць запыт аналагічна запыту .find_by ():

Ці вы можаце назваць гэта больш падобна на SQL, як так:

У большасці выпадкаў гэта фармулёўка з'яўляецца пераважнай, паколькі перадача аргументаў ускосна праз? S дазваляе атрымаць больш бяспеку вашых параметраў і забяспечвае ўзровень абароны ад упырсквання шкоднаснага кода. Не варта турбавацца пра выхад бітай пры навучанні, але важна памятаць.

Калі вы хацелі знайсці ўсе асобнікі астранаўта Майкла Дж. Фокса, альбо Астранаўта Майкла Дж. Фокса, вы маглі б злучыць вашыя.

Злучэнне падобных запытаў разам з выкарыстаннем .or, а таксама магчымасць пошуку з дапамогай няяўных і, як ужо гаварылася вышэй, дае .where () магутную ўтыліту, калі справа даходзіць да прачэсвання базы дадзеных і вяртання некалькіх асобнікаў класаў менавіта так, як вам гэта трэба .

Цяпер, калі мы даведаліся пра ўсе тры найбольш распаўсюджаныя метады запытаў у Rails і ActiveRecord, наступным крокам будзе практыка і выкарыстанне іх ва ўласных дадатках! Звярнуўшыся да дакументаў па Rails, вы будзеце працягваць прадастаўляць рэкамендацыі і далейшы агляд вашага шляху. Поспехаў!