ActiveRecord sorğuları və siz: iş üçün düzgün metodu necə (() tapmaq olar

Unsplash-də Agence Olloweb-ın şəkli

Əgər mənim kimi bir şey edirsinizsə, onda yeni bir proqramçı kimi məlumat bazaları haqqında ilk dəfə öyrənəndə təcrübəniz heyranedici bir şey idi. Birdən, İnternetin mürəkkəb daxili işləmələri qarşınıza çıxdı - masalar və dərnəklər.

SQL öyrənmək və bu verilənlər bazası ilə necə qarşılıqlı əlaqə qurmaq lazım gəldiyində mənim kimi bir şey varsa, ilk təcrübələriniz əvvəlcədən gətirilmiş reverie'nizdən bir az kobud oyanış çağırışı var idi. Birdən başa düşürsən ki, çox sayda məlumat saxlayan hər bir verilənlər bazasında bu məlumatı əldə etmək üçün cəsarətli bir şeyi necə həll etməyi bilən biri olmalıdır. Və yəqin ki, gec-tez kiminsə sən olacağını başa düşdün.

Şükürlər olsun ki, müasir proqramlaşdırma çərçivələri bizə məlumatların yaradılması, saxlanması və alınması üçün rahat və intuitiv yollar verdi. Bu gün bir konkret çərçivədən bəhs edəcəyik - Ruby on Rails - və verilənlər bazası idarəetməsini çovğuna çevirən bir cəhət - ActiveRecord.

Relslər və ActiveRecord internetdə yaxşı sənədləşdirilmişdir, buna görə də bu günə qədər daha ağıllı insanlara daha dərin təhlili buraxacağam. Bu gün digər tələbələrin eyni tələyə düşməmələri üçün çərçivəni ilk dəfə öyrənərkən məni çaşdıran bir cəhətə toxunacağam: verilənlər bazası sorğuları.

Bir Rails tətbiqetməsində, modelləriniz, nəzarətçiləriniz və görüntüləriniz, hər şeyi bazanıza qənaət etmək üçün əla bir iş görmək üçün gücləri birləşdirir, amma nəticədə bəzi məlumatlar vermək üçün həmin məlumatları geri çəkməli olacaqsınız. və ya sadəcə onları göstərmək üçün. Sorğular meydana çıxdıqda. ActiveRecord daxilindəki sorğular, ilk növbədə onu necə əldə edəcəyinizi düşünmək əvəzinə, bu məlumatla nə edəcəyiniz barədə daha çox düşünməyə imkan verən isti bir yorğana bükülmüş SQL əmrləridir.

Hər məqsəd üçün mövcud olan çox sayda xüsusi sorğu metodu var və bunların hamısını rəsmi Rails sənədlərində oxuya bilərsiniz, amma bu gün ən ümumi üç və aralarındakı fərqlərə toxunacağam. Kontekstual kod nümunələri ilə oxşar bir neçə oxşar metod:

  1. .find ()
  2. .find_by ()
  3. . harada ()

.find ()

tapmaq () bəlkə də hamısının ən sadə sorğu metodudur, amma buna baxmayaraq güclüdür. Bu, bir arqument olaraq keçdiyiniz əsas açar (ID) ilə əlaqəli bir verilənlər bazasından bir obyekt çıxarmağa imkan verir. Deyək ki, gecədən bir tok-şouda qonağı təmsil edən bir sinif qurdun:

Hər qonaq nümunəsi yaradıldıqdan sonra qeyd olunduğu üçün verilənlər bazasında əsas açar və ya şəxsiyyət sənədi verilir. Gələcəkdə bu qonaq nümunəsini əldə etmək üçün Qonaq sinifindəki tapmağı () belə doldurmağınız kifayətdir (məsələn, dəyişənlərə qeyd etmək üçün):

Çağırıldığı zaman bu qonaq sinif nümunəsini geri qaytaracaq:

Yuxarıdakı find () metodu üçün başlıq altında işlədilən SQL ekvivalenti:

Görünə bilər ki, tapmaq () çox xüsusi bir metoddur - axı, verilənlər bazasındakı bir obyekt nümunəsinin şəxsiyyət nişanının nə olduğunu dəqiq bilirsinizmi? Təəccüblüdür ki, şəxsiyyət sənədlərini düşündüyünüzdən daha tez-tez əldə edə biləcəksiniz, xüsusən də relslərdə HTTP parametrlərindən istifadə edərkən. Ancaq yenə də çox konkret bir məqsədə xidmət edir.

Diqqətə çatdırmaq lazımdır ki, bir neçə misal üçün əsas düymələri bir arqument olaraq dəlil olaraq qaytara bilərsiniz:

Bənzər bir şeyi istifadə edərək yerinə yetirə bilərsiniz:

.yaxmaq

bir rəqəmi bir dəlil olaraq qəbul edir və çox sayda sinifin artan qaydada olduğunu görür.

Bənzər oxşar tapıntılar () daxildir:

. ilk və .last

müvafiq olaraq, sinifin ən erkən və ən yeni yaradılan nümunələrini əldə edə bilərsiniz. Bunlara həm arqumentlər kimi nömrələr verilə bilər, həm də sinfin bir çox nümunəsini müvafiq olaraq artan və ya enən qaydada qaytararaq.

Bu, növbəti və daha çox yönlü sorğu metodumuza aparır: find_by ()

.find_by ()

İlk baxışdan .find_by () tanış görünə bilər, amma tanışlıqlar tez bitər. .Find (), .find_by () kimi bir sinifdən yalnız bir obyekti geri qaytarır, lakin əsas açardan başqa digər atributları axtarmağa icazə verməklə və birdən çox atributun eyni anda axtarmağa imkan verməklə özünü fərqləndirir. Məsələn, adlarını axtararaq qonaq tapmaq istəyə bilərsiniz:

Ekvivalent SQL burada:

Əla, geri bir obyekt aldıq! Ancaq gözləyin, bu Michael J. Fox aktyor, və Michael J. Fox astronavt tapmaq istədik! (Qeyd: bu yalnız bir nümunədir, Michael J. Fox adlı bir astronavtın varlığını təsdiqləyə və inkar edə bilmirəm.)

Bu nümunəni tapmaq üçün daha da göstərə bilərik:

Uğur! Axtarışımızı dəqiq tənzimləmək bacarığımız sayəsində Qonaq sinifinin düzgün nümunəsini düzəltdik. Bu .find_by () gücüdür. Axtarışınızı daraltmaq üçün nəzəri cəhətdən çox sinif atributlarını istədiyiniz kimi axtara bilərsiniz.

Sinif metodlarını yaratmaq üçün çox yönlü bir vasitədir tətbiqlərinizdə xüsusi birləşdirici siniflər tapmaq üçün .find_by () istifadə edə bilərsiniz. Deyək ki, qonaq bir tok-şounun müəyyən bir epizodunda göründü və bu görünüşlə əlaqəli məlumatları tapmaq istədiniz. Görünüş sinifimiz mövcuddursa:

Görünüşün bu xüsusi nümunəsini asanlıqla əldə etmək üçün .find_by () istifadə edə və məntiqi istədiyiniz yerə daxil edə bilərsiniz. Qonaq üçün sinif metodu kimi istifadə edək:

Bir qonaq nümunəsində istifadə edildikdə və bir epizodun bir nümunəsini bir arqument olaraq verdikdə, bu xüsusi bir Görünüşün nümunəsini qaytaracaqdır. Qəribə!

“Ancaq” deyə bilərsən, “bir sinifdən çox nümunə götürmək istəsən nə edim? Maykl J. Foksun həm aktyor, həm də kosmonavt Maykl J. Foksun hər nümunəsini almaq istəyərdim? ”

Sual verdiyinizə şadam, çünki növbəti və son metodumuzun yer aldığı yerdir:. Yerdə ()

. harada ()

Bu yazıda toxunduğumuz üç əsas sorğu metodundan, burada (), bəlkə də ən çox yönlü, eyni zamanda ən mürəkkəb və ən asan qarışıq olmaqdır.

.Find () və .find_by () bir obyektin tək nümunələrini qaytararkən,. (() "ActiveRecord :: Münasibət obyekti" adlandırılanı geri qaytarır, bir sıra əlavə məlumatlar əlavə edilmiş bir sıra hallarda. Nəticə olaraq .where () -dan istifadə etmək də iç içə məlumatların massivləri ilə işləmək üçün bir qədər aralıq bilik tələb edəcəkdir.

. yerdə () bir "Vəziyyət" metodu kimi düşünülməlidir, bu, hansı obyektlərin geri qaytarıldığını idarə etmək üçün imkan verir ki, bu da verilənlər bazanızla müqayisə olunmaq və geri qaytarılanı məhdudlaşdırmaq üçün "şərtlər" qoyur. Bir daha daha inkişaf etmiş mövzular üçün Şərtlər haqqında Rails sənədlərini oxumağı məsləhət görürəm, amma ehtiyacınız ola biləcək əsas istifadə hallarına toxunacağam. ((Əhatə etmək üçün).

Michael J. Fox adlı qonaqlara BÜTÜN nümunələri tapmaq üçün bir əvvəlki. () Tələbinin sintaksisini yaza bilərsiniz.

Vay, indi daha da var! Rəssam Michael J. Fox və musiqiçi Michael J. Fox da var. Sadə bir üsulla hər qonaqdan bu adla bir sıra əldə etdik - nə güclü bir vasitədir!

İşlərin maraqlı alındığı yer budur. Birdən çox şərtləri bir yerə () sorğuya keçirmək istəyirsinizsə, sintaksis az tanış bir şeyə dəyişəcəkdir.

Michael J. Fox adlı aktyorların çoxsaylı nümunələri olsaydı, sorğunu bir .find_by () tələbinə bənzər şəkildə ifadə edə bilərsiniz:

Yoxsa bunu SQL-ə bənzər şəkildə ifadə edə bilərsən:

Əksər hallarda bu ifadəyə üstünlük verilir, çünki arqumentləri dolayı yollarla keçmək parametrlərinizdə daha çox təhlükəsizlik təmin edir və zərərli kod inyeksiyasından qorunma qatını təmin edir. Öyrənərkən yarasından dərhal narahat olmaq üçün bir şey deyil, unutmayın.

Michael J. Fox aktyoru və ya Michael J. Fox astronavtının bütün nümunələrini almaq istəsəniz, daha mürəkkəb bir sorğu yaratmaq üçün birlikdə.. () Tələblərini birləşdirə bilərsiniz:

Bənzər istəkləri. Ya da istifadə etməklə yanaşı, gizli və yuxarıda qeyd edildiyi kimi axtarış etmək imkanı da istifadə edərək, verilənlər bazanızdan keçmək və çoxsaylı sinif nümunələrinin sizə necə ehtiyac duyduğunuzu dəqiq bir şəkildə geri qaytarmaq üçün gəldikdə güclü bir köməklik verir. .

İndi Rails və ActiveRecord-da ən çox yayılmış sorğu metodlarının hamısını öyrəndik, növbəti addım təcrübə və öz tətbiqlərinizdə istifadə etməkdir! Reys sənədlərinə istinad edərək, səfərinizdə rəhbərlik və əlavə araşdırma verməyə davam edəcəksiniz. Uğurlar!