Kjo synon t'i ilustrojë fillestarit disa nga mjetet e "pjekura" të ActiveRecords që lejojnë operacionet SQL në një mjedis Ruby. Këto mjete mund të kursejnë shumë kohë, por mund të ushtrohen vetëm në kushte të caktuara specifike. Si rishtar, kisha përshtypjen se nuk mund të përfitoja fare nga komandat SQL brenda Ruby. Shpresoj që keqkuptimet e mia fillestare dhe gabimet frustruese të jenë të dobishme dhe të jenë ndriçuese për të sapoardhurit kërkues ambicioz.

Gjatë projektit të parë grupor në bootcamp-in e kodimit, ekipi ynë kishte krijuar një aplikacion të listës muzikore CRUD të ndërfaqes së linjës së komandës që përdorte si një nga modelet e tij një klasë Këngë, me atribute që përfshinin titullin dhe artistin. Një nga mënyrat e ndryshme se si përdoruesit mund të zgjidhnin një këngë për ta shtuar në listën e tyre të luajtjes u trajtua nga një metodë kërkimi. Megjithëse ishte funksional, ai ishte mjaft i pafalshëm për përdoruesin fundor pasi termi i kërkimit duhej të përputhej me shkronjën *saktësisht* për shkronjën, duke përfshirë nëse ishte e madhe, e vogël ose kishte shenja theksi (më falni, Beyoncé.)

Unë guxova ta modifikoja këtë metodë kërkimi për t'u bërë më falëse duke lejuar një përputhje të pjesshme të vargut. Pasi hulumtova për disa rrugë të mundshme për të ndjekur, fillova të shkruaj kodin tim. Për të vendosur skenën, ekziston një klasë modele e quajtur Kënga me atribute të artistit, titullit dhe zhanrit. Arsyeja ime ishte të vendosja vargun e pjesshëm në një ndryshore, dhe më pas të përdorja një numërues për të përsëritur në të gjithë klasën duke përdorur .include?

Dështoi dhe po kthente të gjithë grupin. Në mënyrë të pahijshme, kjo përpjekje e gabuar në Ruby më çoi në një rrugë që përndryshe nuk do ta kisha marrë për të eksploruar ActiveRecords, duke i bërë të qarta njëkohësisht supozimet e mia të gabuara. Do të shtjelloj atë që mësova më vonë, por le ta hetojmë çështjen këtu tani….

Në këtë rast, .secili përsëritej mbi çdo regjistrim dhe e kthente atë. Mënyra e duhur se si duhet të kisha vepruar ishte me .select. Kjo përsëritet mbi çdo regjistrim, por kthen vetëm ato që përputhen me kriterin.

Kjo *po funksionon, por saktësisht sa falëse është për përdoruesin fundor? A do të jetë mjaft fleksibël për të akomoduar shkronjat e papërputhshme të kapitolit dhe shkronjave të vogla? Le të shohim duke kërkuar një varg të pjesshëm me shkumë të përzier të Awkwafina….

Kjo nuk gjeti regjistrime dhe ktheu një grup bosh. Puna përreth është që të vendosen të gjitha rekordet në .upcase ose .downcase, dhe duke bërë të njëjtin veprim me termin e kërkimit.

Kjo mënyrë për ta bërë atë në Ruby ishte shumë e pakapshme për mua dhe mbi notën time të pagës në atë kohë. Për fat të mirë, duke goditur një mur me sulmin tim fillestar me .secilin, hetova metoda të tjera që rezultuan më të frytshme - dhe kjo është përdorimi i ActiveRecords si një urë lidhëse midis bazës së të dhënave tuaja Ruby dhe SQL.

Ndërsa kodi Ruby i diskutuar më sipër kthen rezultatin e dëshiruar, shikoni sa i përmbledhur është kodi më poshtë në krahasim.

Vetëm termi i kërkimit duhej të vendosej në një ndryshore dhe më pas të interpolohej, dhe ky veprim u krye në të gjithë klasën. Çdo shembull kënge nuk kërkohej të vendosej në një grup. Nuk kishte nevojë për përsëritje. Dhe përshtatet automatikisht për rastet e përziera. Përveç kësaj, duke përdorur shkronjën "%" të SQL, ai lejon një opsion kërkimi më të akorduar - në raste të tilla si dëshira për të kthyer rezultatet vetëm aty ku përputhet si parashtesë (termi i kërkimit%) ose si prapashtesë (%kërkimi term ).

Pasi e kuptova këtë, kuptova se mund të përdorja shumë pyetje SQL në një mjedis Ruby që më parë e kisha menduar se nuk disponohej (p.sh. BASHKIMI I BRENDSHËM me .joins, find_by dhe mjete të reja si .pluck). Një listë e plotë e tyre mund të gjendet "këtu".

Megjithatë, një fjalë kujdes….këto mjete SQL mund të përdoren vetëm në regjistrimet e bazës së të dhënave "të pastra", dhe jo grupe të formuara në Ruby ose regjistrime të bazës së të dhënave të transformuara në Ruby. Unë do të ilustroj më poshtë.

Mbani mend nga shembulli ynë i parë një variabël i të gjitha këngëve që vendoset në veprimin Song.all. Kopja e mësipërme të gjitha_songs_është një .çdo përsëritje e thjeshtë që kopjon çdo shembull të këngës në të gjitha_këngët pa pushim në një grup të ri. Përmbajtja e të dyve është identike. Dallimi midis tyre është se origjinali all_song është një grup regjistrimesh "të pastra" SQL, ndërsa i dyti është një grup i krijuar në rubin, dhe kështu është një objekt Ruby.

Pyetja .where mund të përdoret në klasën Song. Ai madje mund të përdoret në një grup variablash në një grup të të dhënave të tij të marra direkt nga baza e të dhënave. Por pasi ky grup të jetë përsëritur, pyetjet SQL të disponueshme përmes ActiveRecords nuk janë më të zbatueshme dhe nuk mund të përdoren.

Pra, kodimi i lumtur, shijoni këto mjete dhe kini parasysh se ku mund të përdoren.