ActiveRecord Ufroen an Dir: wéi fannt () déi richteg Method fir den Job

Foto vun Agence Olloweb op Unsplash

Wann Dir eppes wéi ech sidd, dann ass Är Experienz wann Dir éischt iwwer Datenbanken als neie Programméierer léiert war eppes vun enger Erstaunleches Inspiratioun. Op eemol goufen déi komplex bannenzeg Aarbechten um Internet virun Iech geluecht - et sinn Dëscher an Associatiounen de ganze Wee erof.

Wann Dir och eppes wéi ech sidd wann et drëms geet SQL ze léieren a wéi Dir tatsächlech mat dësen Datenbanken interagéiert, Är éischt Erfarungen do ware méiglecherweis e bësse vun engem ruppegen Erwächt vun Ärer virdru induzéierter Reverie. Op eemol realiséiert Dir datt fir all Datebank enorm Quantitéiten vun Informatioun stockéiert gëtt, do muss een iergendeen wëssen, wéi déi schei Saachen ze wrangle fir dës Informatioun eraus ze kréien. An Dir hutt wahrscheinlech gemierkt dat besonneschen een ass, fréier oder spéider wäert Iech sinn.

Glécklecherweis hunn modern Programméierungs-Kaderen eis praktesch an intuitiv Weeër ginn fir Daten ze kreéieren, ze späicheren an z'erhalen. Haut wäerte mir iwwer ee bestëmmte Kader schwätzen - Ruby on Rails - an ee bestëmmten Aspekt dovun dat d'Datebankmanagement zu enger Loft mécht - ActiveRecord.

Rails an ActiveRecord si gutt iwwer den Internet dokumentéiert, sou datt ech eng méi déif Analyse vun hinnen op aner, méi schlau Leit fir de Moment verloossen. Haut wäert ech un engem Aspekt besonnesch beréieren, deen mech ausgeléist huet, wann ech de Kader fir d'éischt geléiert hunn, fir datt aner Studenten déi selwecht Ofstëmmunge vermeiden: Datebank Ufroen.

An enger Rails Applikatioun kombinéieren Är Modeller, Controller a Meenungen all Kräfte fir eng exzellent Aarbecht ze maachen fir d'Saachen an Ärer Datebank ze spueren, awer schliisslech musst Dir dës Instanzen vun Informatioun zréck zéien fir e puer Logik op hinnen ze maachen, oder einfach se ze weisen. Dat ass wann Ufroen an d'Spill kommen. Queries bannent ActiveRecord si wesentlech SQL Kommandoen, déi an enger waarmer Decken gewéckelt sinn, liesbar, schreiwe Ruby Syntax, wat Iech erlaabt Iech méi ze denken iwwer wat Dir mat dësen Daten maacht anstatt ze denken wéi Dir se op der éischter Plaz erëmkritt.

Et gi vill verschidde spezifesch Ufromethoden déi fir all Zweck existéieren, an Dir kënnt alles iwwer hinnen op der offizieller Rails Dokumentatioun liesen, awer haut ginn ech op déi dräi meescht gemeinsam an d'Differenzen tëscht hinnen, souwéi eng e puer ähnlech ähnlech Methoden mat Kontextkode Beispiller:

  1. .find ()
  2. .find_by ()
  3. .ëmmer ()

.find ()

fannen () ass vläicht déi einfachst Ufromethod vun allem, awer e mächtege. Et erlaabt Iech en een Objet aus Ärer Datebank ze kréien, wat de primäre Schlëssel (ID) ugeet, deen Dir als Argument gitt. Loosst eis soen datt Dir eng Klass ageriicht hutt déi e Gaascht op enger spéid-Nuecht Talkshow representéiert:

Wéi all Instanz vun engem Gaascht gëtt gespäichert nodeems se erstallt gouf, kritt en en primäre Schlëssel, oder ID, an der Datebank. Fir dëst Gaaschtinstanz an Zukunft z'erreechen, géift Dir einfach Fannt ausfëllen () an der Guest Class als sou (späichert et an enger Variabel zum Beispill Zwecker):

Wéi eng gëtt déi Gaaschtklass Instanz zréck wann hie gefrot gëtt:

De SQL-Äquivalent deen ënner der Hood leeft fir d'Find () Method hei uewen ass:

Et kann ausgesinn wéi fannen () ze spezifesch Method ass - ëmmer, wéi dacks wësst Dir genau wat d'ID vun enger Instanz vun engem Objet an Ärer Datebank ass? Iwwerraschend kritt Dir IDs méi dacks zou wéi Dir denkt, besonnesch wann Dir HTTP Parameter am Rails benotzt. Awer trotzdem, et déngt e ganz spezifeschen Zweck.

Et ass derwäert ze bemierken datt Dir verschidde Instanzen zréck ka bréngen andeems Dir an engem Array vun primäre Schlësselen als Argument passéiert:

Dir kënnt eppes ähnleches erreechen andeems Dir:

.zehuelen

deen eng Nummer als Argument kritt an déi vill Fäll vun der Klass an opsteigender Uerdnung retrieves.

Ähnlech Off-Shoots vu Find () enthalen:

.fir an .last

déi fréi an déi lescht erstallt Instanzen vun der Klass zréckzéien, resp. Dës kënnen als Zuelen och als Argumenter uginn ginn, déi zréckginn datt vill Instanzen vun der Klass entweder op eropgaang sinn oder erofgaangs Uerdnung, respektiv.

Dëst féiert eis an eis nächst a méi vielseiteg Ufro Method: find_by ()

.find_by ()

Op den éischte Bléck, .find_by () schénge vläicht familiär ze sinn, awer d'Familljen enden séier op. Wéi .find (), .find_by () gëtt implizit nëmmen en Objet vun enger Klass, awer differenzéiert sech andeems aner Attributer niewent engem primäre Schlëssel gesicht ginn, a méi wéi ee Attribit gläichzäiteg gesicht gëtt. Zum Beispill, Dir wëllt vläicht e Gaascht fannen andeems Dir hiren Numm sichs:

Déi gläichwäerteg SQL hei ass:

Super, mir hunn en Objet zréck! Awer waart, dëst ass de Michael J. Fox de Schauspiller, a mir wollten den Michael J. Fox den Astronaut fannen! (Remark: dëst ass just e Beispill, ech kann d'Bestëmmung vun engem Astronaut mam Michael J. Fox net bestätegen oder verweigeren.)

Fir dës Instanz ze fannen, kéinte mer weider präziséieren:

Hurra! Dank eiser Fäegkeet fir eis Sich ze finanzéieren, hu mir déi richteg Instanz vun der Gaaschtklass opgedréckt. Dëst ass d'Kraaft vu .find_by (). Dir kënnt theoretesch esou vill Klassattributer sichen wéi Dir wollt, fir Är Sich ze verréngeren.

Dir kënnt och .find_by () benotze fir spezifesch Joiner Klassen an Ären Uwendungen ze fannen, wat e ganz villsäitegt Tool ass fir Klassmethoden ze kreéieren. Loosst eis soen datt e Gaascht op enger bestëmmter Episode vun enger Talkshow opgetaucht war, an Dir wollt d'Informatioun mat deem Erscheinung fannen. Wann eis Ausgesi-Klass esou existéiert:

Dir kënnt .find_by () benotze fir dës spezifesch Instanz vun der Erscheinung zimlech einfach zréckzehuelen, an dës Logik iergendwou anzeginn. Loosst eis et als Klassmethod fir Guest benotzen:

Wann et op enger Instanz vun engem Gaascht benotzt gëtt a wann een eng Instanz vun engem Episode als Argument kritt, da géif dës Instanz vun där enger spezifescher Ausgesinn zréck ginn. Erstaunlech!

"Awer", kéint Dir soen, "wat wann ech méi Instanzen vun enger Klass zréckzéien? Wat wier wann ech all Instanz vum Michael J. Fox, dem Schauspiller, wéi och vum Michael J. Fox, dem Astronaut wëllen zréckzéien? "

Ech si frou, datt Dir Iech gefrot hutt, well dat ass wou eis nächst an déi lescht Method an d'Spill kënnt: .where ()

.ëmmer ()

Vun den dräi Haaptfro Methoden op déi mir an dësem Post betreffen,. Where () ass méiglechst déi villsäitegst, awer och déi komplexst an einfachst duerchernee ginn.

Während .find () an .find_by () eenzel Enquête vun engem Objet zréckginn, .where () gëtt dat wat en "ActiveRecord :: Relation object" nennt, am Wesentlechen eng ganz Rëtsch vun Instanzen mat e puer extra Informatioun befestegt. Als Resultat wäert d'Uwendung. Wou () voll och e puer méi Zwëschenwëssen erfuerderen fir mat Arrays vun genesten Informatioun ze schaffen.

. Wou () sollt als eng "Conditioun" Method geduecht ginn, alias déi et Iech erlaabt ze kontrolléiere wat Objeten zréck ginn andeems Dir "Bedéngungen" setzt fir duerch Är Datebank ze kammen an ze limitéieren wat zréck kënnt. Eng Kéier encouragéieren ech d'Rails Dokumentatioun iwwer Konditioune fir méi fortgeschratt Themen ze liesen, awer ech beräich op d'Basis Benotzungsfäll, déi Dir wahrscheinlech braucht. Wou () fir ze decken.

Dir kënnt d'Syntax vun engem. Where () Ufro ähnlech wéi eis virdrun Beispiller ausschreiwe fir ALL Fäll vu Gäscht mam Numm Michael J. Fox ze fannen:

Wow, elo ginn et der nach méi! Mir hunn de Michael J. Fox de Moler, an de Michael J. Fox de Museker och. Mat enger einfacher Method krute mir eng Serie vun all eenzele Gaascht mam Numm - wat e mächtegt Tool!

Hei ass wou d'Saache interessant ginn. Wann Dir verschidde Bedéngungen an eng .where () Ufro wëllt weiderginn, ännert d'Syntax an eppes manner vertraut.

Wann et e puer Ënnerscheeder vun Akteure goufen, déi de Michael J. Fox genannt hunn, kéinte Dir d'Fro ähnlech wéi eng .find_by () Ufro ausdrécken:

Oder Dir kënnt et méi ähnlech mat SQL ausdrécken, esou:

Dës Fraséierung gëtt an de meeschte Fäll bevorzugt, well d'Argumenter indirekt duerch den? S passen erlaabt méi Sécherheet an Äre Parameteren a gëtt eng Schicht Schutz géint béiswëlleg Codeinjektioun. Net eppes ze suergen iwwer de Fliedermaus beim Léieren, awer wichteg am Kapp ze halen.

Wann Dir all Instanze vum Michael J. Fox, dem Schauspiller ODER Michael J. Fox, dem Astronaut wollt zréckzéien, da kënnt Dir Är. Wou () Ufroen zesumme kreéieren fir eng méi komplex Ufro ze kreéieren:

Ketten ähnlech Ufroen zesumme mat .or, souwéi d'Fäegkeet fir mat implizit a wéi hei uewen ze sichen, gëtt .where () e kräftegt Utility wann et drëm geet duerch Är Datebank ze kombinéieren a verschidde Instanzen vu Klassen zréckzekréien, wéi Dir se braucht. An.

Elo datt mir all dräi vun de meescht allenzäitegst Ufro Methoden am Rails an ActiveRecord geléiert hunn, ass de nächste Schrëtt fir se an Ären eegene Uwendungen ze üben an ze benotzen! D'Rails Dokumentatioun verweise wäert weiderhin Orientatioun a weider Iwwerpréiwung op Är Rees ginn. Vill Gléck!