ActiveRecord consulta i tu: com es troba () el mètode adequat per al treball

Foto d'Agence Olloweb a Unsplash

Si sou alguna cosa com jo, aleshores la vostra experiència en conèixer primer les bases de dades com a nou programador va ser una experiència fantàstica. De sobte, les complexes funcions interiors d’Internet es van posar de manifest: es tracta de taules i associacions.

Si també sou com res a l’hora d’aprendre SQL i com interactuar realment amb aquestes bases de dades, és probable que les vostres primeres experiències tinguessin una trucada de desperta despertada de la vostra revelació anteriorment induïda. De sobte, t’adones que per a cada base de dades que emmagatzema una gran quantitat d’informació, hi ha d’haver algú que sàpiga com es pot treure l’obsequi per treure’n aquesta informació. I probablement t’has adonat que algú particular, tard o d’hora, seràs tu.

Per sort, els moderns marcs de programació ens han proporcionat formes còmodes i intuïtives de crear, emmagatzemar i recuperar dades. Avui parlarem d’un marc concret: Ruby on Rails i d’un aspecte particular que fa que la gestió de bases de dades sigui una brisa: ActiveRecord.

Els carrils i ActiveRecord estan ben documentats a Internet, de manera que deixo un anàlisi més profund dels mateixos per a altres persones més savis de moment. Avui em toca un aspecte, en particular, que m’ha agafat un cop en aprendre el marc, de manera que altres estudiants puguin evitar els mateixos entrebancs: consultes de bases de dades.

Dins d'una aplicació Rails, els vostres models, controladors i visualitzacions combinen totes les forces per fer un treball excel·lent per estalviar coses a la base de dades, però, finalment, haureu de retirar aquestes situacions d'informació per fer-hi alguna lògica, o simplement per mostrar-los. És aleshores quan entren en contacte les consultes. Les consultes a ActiveRecord són fonamentalment ordres SQL incloses en una manta càlida de llegenda i la sintaxi de Ruby que permeten pensar més sobre què faràs amb aquestes dades en lloc de pensar en com recuperar-la en primer lloc.

Hi ha molts mètodes de consulta específics que existeixen per a tots els propòsits i els podeu llegir tot sobre la documentació oficial de Rails, però avui us tocaré els tres més comuns i les diferències entre ells, així com una pocs mètodes relacionats amb exemples de codi contextual:

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

.find ()

Trobar () és potser el mètode de consulta més senzill de tots, però un poderós. Permet recuperar un únic objecte de la base de dades relacionat amb la clau primària (ID) que introduïu com a argument. Suposem que heu creat una classe que representi un convidat en un programa de xerrades a la nit:

Com que cada instància de convidat es guarda després de la creació, se li proporciona una clau primària o ID a la base de dades. Per recuperar aquesta instància de convidat en el futur, només heu d’omplir el cercador () a la classe de convidats (talment (desant-lo en una variable amb propòsits per exemple)):

La qual retornarà aquesta instància de la classe de convidat quan us cridi:

L'equivalent SQL que s'executa sota el capó del mètode find () anterior es mostra:

Pot semblar trobar un mètode massa específic (al capdavall, amb quina freqüència sabràs exactament quina és la ID d'una instància d'un objecte de la base de dades? Sorprenentment, podreu accedir als identificadors amb més freqüència del que creieu, especialment quan utilitzeu paràmetres HTTP a Rails. Però, tot i així, serveix per a un propòsit molt concret.

Cal destacar que podeu retornar diverses instàncies passant una matriu de claus primàries com a argument:

Podeu realitzar alguna cosa semblant mitjançant:

.take

que rep un número com a argument i recupera moltes instàncies de la classe en ordre ascendent.

Els brots de troballa similars inclouen:

.primer i. últim

que recuperen les instàncies més primerenques i recents de la classe, respectivament. Aquests també es poden donar nombres com a arguments, retornant que moltes instàncies de la classe en ordre ascendent o descendent, respectivament.

Això ens porta al següent mètode de consulta més versàtil: find_by ()

.find_by ()

A primera vista, .find_by () pot semblar familiar, però les familiaritats acaben ràpidament. Igual que .find (), .find_by () torna implícitament només un objecte d’una classe, però es diferencia tot permetent que es busquin altres atributs a més d’una clau primària i permetent que es busquin més d’un atribut alhora. Per exemple, potser voldreu trobar un convidat cercant el seu nom:

El SQL equivalent aquí:

Genial, hem tornat a obtenir un objecte. Però espera, aquest és l’actor Michael J. Fox, i volíem trobar l’astronauta de Michael J. Fox! (nota: aquest és només un exemple, no puc confirmar ni negar l'existència d'un astronauta anomenat Michael J. Fox.)

Per trobar aquesta instància, podríem especificar més:

Hooray! Gràcies a la nostra capacitat d’ajustar la cerca, hem trobat la instància correcta de la classe de convidats. Aquesta és la potència de .find_by (). Teòricament podríeu cercar tants atributs de classe com vulgueu per restringir la cerca.

També podeu utilitzar .find_by () per trobar classes d'unió específiques a les vostres aplicacions, que és una eina molt versàtil per crear mètodes de classe. Suposem que un convidat havia aparegut en un episodi en concret d’un programa de xerrades i que volies trobar la informació associada a aquesta aparença. Si la nostra classe Aspecte existeix com a tal:

Podeu utilitzar .find_by () per recuperar aquesta instància específica d'Aparició amb molta facilitat i inserir aquesta lògica a qualsevol lloc que vulgueu. Utilitzem-lo com a mètode de classe per a convidats:

Si s'utilitza en una instància d'un convidat i se li dóna una instància d'un episodi com a argument, això retornaria la instància d'aquest aspecte específic. Sorprenent!

"Però", podríeu estar dient, "i si volgués recuperar diverses instàncies d'una classe? Què passaria si volgués recuperar totes les instàncies de l’actor Michael J. Fox i l’astronauta de Michael J. Fox? ”

M’alegro que ho hagis preguntat, perquè aquí entra en joc el nostre mètode següent i final: .where ()

. On ()

Dels tres mètodes de consulta principals que tractem en aquesta publicació, .where () és possiblement el més versàtil, però també el més complex i el més fàcil de confondre.

Mentre que .find () i .find_by () retornen instàncies úniques d’un objecte, .where () retorna el que s’anomena “objecte ActiveRecord :: Relació”, essencialment una matriu d’instàncies amb una informació addicional adjunta. Com a resultat, l'ús complet de .where () també requerirà uns coneixements més intermedis per treballar amb matrius d'informació imbricada.

.where () s’ha de pensar com un mètode “Condició”, també conegut com un que permet controlar quins objectes s’estan retornant establint quines “condicions” es poden combinar a través de la vostra base de dades i limitar el que es retorna. Una vegada més, animo a llegir la documentació de Rails sobre Condicions per a temes més avançats, però vaig a tocar els casos d’ús bàsics que és possible que necessiteu.

Podeu escriure la sintaxi d'una sol·licitud.. () De manera similar als nostres exemples anteriors per trobar TOTES les instàncies de convidats anomenats Michael J. Fox:

Uf, ara encara n’hi ha més! Tenim Michael J. Fox el pintor, i Michael J. Fox el músic també. Amb un mètode senzill, obteníem un conjunt de cada convidat amb aquest nom, quina eina potent!

Aquí és on les coses resulten interessants. Si voleu passar múltiples condicions a una consulta .where (), la sintaxi canviarà per una cosa menys familiar.

Si hi hagués diversos casos d'actors anomenats Michael J. Fox, podríeu expressar la consulta de manera similar a una sol·licitud .find_by ():

O podríeu expressar-ho de manera més similar a SQL, així:

Aquesta frase es prefereix en la majoria dels casos, ja que passar els arguments de forma indirecta a través dels? Permet una major seguretat en els vostres paràmetres i proporciona una capa de protecció contra la injecció de codi maliciós. No és una cosa que es preocupi per sortir del bat a l’hora d’aprendre, però és important tenir-ho en compte.

Si voleu recuperar totes les instàncies de Michael J. Fox l’actor O Michael J. Fox l’astronauta, podríeu encadenar les vostres peticions .where () junts per crear una consulta més complexa:

L'encadenament de peticions similars juntament amb. O, a més de la capacitat de fer cerques amb un implícit i tal com s'ha esmentat anteriorment, proporciona a .where () una utilitat potent a l'hora de combinar a través de la base de dades i tornar diverses instàncies de classes exactament com les necessiteu. .

Ara que hem après els tres mètodes de consulta més omnipresents a Rails i ActiveRecord, el següent pas és practicar-los i utilitzar-los en les vostres pròpies aplicacions. En fer referència a la documentació dels carrils, continuarà proporcionant guia i revisió addicional sobre el viatge. Bona sort!