Τα ερωτήματα ActiveRecord και εσείς: πώς να βρείτε () τη σωστή μέθοδο για την εργασία

Φωτογραφία από την Agence Olloweb στο Unsplash

Εάν είστε κάτι σαν εμένα, τότε η εμπειρία σας όταν αρχικά μάθατε για τις βάσεις δεδομένων ως νέος προγραμματιστής ήταν κάτι σαν μια ενθουσιώδης εμπειρία. Ξαφνικά, οι σύνθετες εσωτερικές λειτουργίες του διαδικτύου ήταν ξεκάθαρες μπροστά σας - είναι πίνακες και συλλόγους σε όλη τη διαδρομή.

Εάν είστε κάτι σαν εμένα όταν πρόκειται για εκμάθηση SQL και πώς να αλληλεπιδράτε πραγματικά με αυτές τις βάσεις δεδομένων, οι πρώτες εμπειρίες σας ήταν πιθανότατα ένα κομμάτι μιας ακατανόητης κλήσης αφύπνισης από την προηγούμενη επαγρύπνησή σας. Ξαφνικά συνειδητοποιείτε ότι για κάθε βάση δεδομένων που αποθηκεύει τεράστιες ποσότητες πληροφοριών, πρέπει να υπάρχει κάποιος που ξέρει να διαμαρτύρεται για το βρώμικο πράγμα για να αποκτήσει αυτές τις πληροφορίες έξω από αυτό. Και πιθανώς συνειδητοποίησε ότι κάποιος συγκεκριμένος είναι αργά ή γρήγορα, θα είσαι εσύ.

Ευτυχώς, τα σύγχρονα πλαίσια προγραμματισμού μας έδωσαν βολικούς και διαισθητικούς τρόπους δημιουργίας, αποθήκευσης και ανάκτησης δεδομένων. Σήμερα, πρόκειται να μιλάμε για ένα συγκεκριμένο πλαίσιο - το Ruby on Rails - και μια ιδιαίτερη πτυχή του που καθιστά τη διαχείριση βάσεων δεδομένων ένα αεράκι - ActiveRecord.

Τα Rails και το ActiveRecord είναι καλά τεκμηριωμένα σε ολόκληρο το διαδίκτυο, οπότε θα αφήσω τώρα βαθύτερη ανάλυση αυτών σε άλλους, πιο σοφούς ανθρώπους. Σήμερα πρόκειται να αγγίξω μια συγκεκριμένη πτυχή που με απέτρεψε όταν μάθω πρώτα το πλαίσιο, έτσι ώστε οι άλλοι μαθητές να αποφύγουν τις ίδιες παγίδες: ερωτήματα βάσης δεδομένων.

Μέσα σε μια εφαρμογή Rails, τα μοντέλα, οι ελεγκτές και οι απόψεις σας συνδυάζουν όλες τις δυνάμεις για να κάνουν εξαιρετική δουλειά για να αποθηκεύσουν τα πράγματα στη βάση δεδομένων σας, αλλά τελικά θα πρέπει να τραβήξετε αυτά τα παραδείγματα πληροφοριών πίσω για να κάνετε κάποια λογική σε αυτά, ή απλά να τους δείξω. Αυτό συμβαίνει όταν τα ερωτήματα μπαίνουν στο παιχνίδι. Τα ερωτήματα μέσα στο ActiveRecord είναι ουσιαστικά εντολές SQL τυλιγμένες μέσα σε μια ζεστή κουβέρτα γραπτή σύνταξη Ruby, επιτρέποντάς σας να σκεφτείτε περισσότερα για το τι πρόκειται να κάνετε με αυτά τα δεδομένα αντί να σκεφτείτε πώς να την ανακτήσετε στην πρώτη θέση.

Υπάρχουν πολλές ειδικές μέθοδοι ερωτήσεων που υπάρχουν για κάθε σκοπό και μπορείτε να διαβάσετε όλα αυτά σχετικά με την επίσημη τεκμηρίωση Rails, αλλά σήμερα πρόκειται να αγγίξω τα τρία πιο συνηθισμένα και τις διαφορές μεταξύ τους, καθώς και ένα μερικές παρόμοιες συναφείς μεθόδους με παραδείγματα κώδικα με βάση τα συμφραζόμενα:

  1. .εύρημα()
  2. .find_by ()
  3. .που()

.εύρημα()

find () είναι ίσως η απλούστερη μέθοδος ερωτήματος όλων, αλλά μια ισχυρή ωστόσο. Σας επιτρέπει να ανακτήσετε ένα μοναδικό αντικείμενο από τη βάση δεδομένων σας σχετικά με το πρωτεύον κλειδί (ID) που περνάτε ως όρισμα. Ας πούμε ότι έχετε δημιουργήσει μια τάξη που εκπροσωπεί έναν επισκέπτη σε μια talk show αργά το βράδυ:

Καθώς κάθε εμφάνιση του επισκέπτη αποθηκεύεται μετά τη δημιουργία του, δίνεται ένα πρωτεύον κλειδί ή αναγνωριστικό στη βάση δεδομένων. Προκειμένου να ανακτήσετε αυτό το στοιχείο επισκέπτη στο μέλλον, θα συμπληρώσετε απλώς το find () στην κατηγορία Guest ως τέτοιο (αποθηκεύοντας το σε μια μεταβλητή για παράδειγμα):

Ποια θα επιστρέψει αυτή την επίσκεψη κλάσης επισκέπτη όταν σας ζητηθεί:

Το ισοδύναμο SQL που τρέχει κάτω από την κουκούλα για τη μέθοδο find () παραπάνω είναι:

Μπορεί να φαίνεται ότι το find () είναι μια πολύ συγκεκριμένη μέθοδος - τελικά, πόσο συχνά θα μάθετε ακριβώς ποιο είναι το αναγνωριστικό μιας εμφάνισης ενός αντικειμένου στη βάση δεδομένων σας; Παραδόξως, θα έχετε πρόσβαση στα αναγνωριστικά πιο συχνά από ό, τι νομίζετε, ιδιαίτερα όταν χρησιμοποιείτε παραμέτρους HTTP σε Rails. Ωστόσο, εξυπηρετεί έναν πολύ συγκεκριμένο σκοπό.

Αξίζει να σημειωθεί ότι μπορείτε να επιστρέψετε πολλές εμφανίσεις περνώντας σε μια σειρά από πρωτεύοντα κλειδιά ως ένα επιχείρημα:

Μπορείτε να ολοκληρώσετε κάτι παρόμοιο χρησιμοποιώντας:

.παίρνω

η οποία λαμβάνει έναν αριθμό ως επιχείρημα και ανακτά πολλά παραδείγματα της τάξης με αύξουσα σειρά.

Παρόμοιες off-βολές του find () περιλαμβάνουν:

.πρώτος και τελευταίος

που ανακτούν τα πρώτα και τα πιο πρόσφατα δημιουργημένα στιγμιότυπα της κατηγορίας, αντίστοιχα. Αυτά μπορούν να δοθούν αριθμοί ως επιχειρήματα επίσης, επιστρέφοντας ότι πολλές περιπτώσεις της τάξης σε αύξουσα ή φθίνουσα σειρά, αντίστοιχα.

Αυτό μας οδηγεί στην επόμενη και πιο ευπροσάρμοστη μέθοδο ερώτησής μας: find_by ()

.find_by ()

Με την πρώτη ματιά, το .find_by () μπορεί να φαίνεται οικείο, αλλά οι εξοικειώσεις τελειώνουν γρήγορα. Όπως το .find (), .find_by () επιστρέφει σιωπηρά μόνο ένα αντικείμενο μιας κλάσης, αλλά διαφοροποιείται επιτρέποντας την αναζήτηση άλλων χαρακτηριστικών εκτός από ένα πρωτεύον κλειδί και επιτρέποντας ταυτόχρονα την αναζήτηση περισσότερων από ένα χαρακτηριστικών. Για παράδειγμα, μπορεί να θέλετε να βρείτε έναν επισκέπτη αναζητώντας το όνομα του:

Το ισοδύναμο SQL εδώ είναι:

Μεγάλη, έχουμε ένα αντικείμενο πίσω! Αλλά περιμένετε, αυτός είναι ο Michael J. Fox ο ηθοποιός και θέλαμε να βρούμε τον Michael J. Fox τον αστροναύτη! (σημείωση: αυτό είναι μόνο ένα παράδειγμα, δεν μπορώ να επιβεβαιώσω ούτε να αρνηθώ την ύπαρξη ενός αστροναύτη που ονομάζεται Michael J. Fox.)

Για να βρούμε αυτό το παράδειγμα, θα μπορούσαμε να διευκρινίσουμε περαιτέρω:

Ζήτω! Χάρη στην ικανότητά μας να τελειοποιήσουμε την αναζήτησή μας, έχουμε δείξει τη σωστή εμφάνιση της κατηγορίας Guest. Αυτή είναι η δύναμη του .find_by (). Θα μπορούσατε θεωρητικά να αναζητήσετε όσα χαρακτηριστικά γνωρίσματα τάξης θέλετε, προκειμένου να περιορίσετε την αναζήτησή σας.

Μπορείτε επίσης να χρησιμοποιήσετε το .find_by () για να βρείτε συγκεκριμένες κλάσεις του joiner στις εφαρμογές σας, το οποίο είναι ένα πολύ ευέλικτο εργαλείο για τη δημιουργία μεθόδων τάξης. Ας υποθέσουμε ότι ένας επισκέπτης είχε εμφανιστεί σε ένα συγκεκριμένο επεισόδιο μιας ομιλίας και θέλατε να βρείτε τις πληροφορίες που σχετίζονται με αυτήν την εμφάνιση. Εάν η κλάση της εμφάνισής μας είναι τέτοια:

Θα μπορούσατε να χρησιμοποιήσετε το .find_by () για να ανακτήσετε αρκετά συγκεκριμένα την εμφάνιση της εμφάνισης και να εισαγάγετε εκείνη τη λογική οπουδήποτε θέλετε. Ας το χρησιμοποιήσουμε ως μέθοδο κατηγορίας για Guest:

Όταν χρησιμοποιείται σε μια παρουσία ενός Guest και όταν δοθεί ένα παράδειγμα ενός επεισοδίου ως επιχείρημα, αυτό θα επέστρεφε την εμφάνιση αυτής της συγκεκριμένης εμφάνισης. Φοβερο!

"Αλλά", ίσως να λέτε, "τι εάν θα ήθελα να ανακτήσω πολλές περιπτώσεις μιας τάξης; Τι θα γίνει αν θα ήθελα να ανακτήσω κάθε εμφάνιση και του Michael J. Fox, του ηθοποιού και του Michael J. Fox, του αστροναύτη; "

Είμαι χαρούμενος που ρωτήσατε, γιατί εκεί μπαίνει η επόμενη και τελική μας μέθοδος: .where ()

.που()

Από τις τρεις κύριες μεθόδους ερωτήσεων που αγγίζουμε σε αυτήν την ανάρτηση, το .where () είναι ίσως το πιο ευπροσάρμοστο, αλλά και το πιο περίπλοκο και το πιο εύκολο να συγχέεται.

Ενώ οι .find () και .find_by () επιστρέφουν μόνο στιγμιότυπα ενός αντικειμένου, .where () επιστρέφει αυτό που ονομάζεται "αντικείμενο ActiveRecord :: Relation", ουσιαστικά μια σειρά από περιπτώσεις με συνημμένες πρόσθετες πληροφορίες. Ως αποτέλεσμα, η χρήση του .where () θα απαιτεί επίσης κάποιες ενδιάμεσες γνώσεις εργασίας με συστοιχίες ένθετων πληροφοριών.

.where () θα πρέπει να θεωρηθεί ως μέθοδος "Condition", δηλαδή μια που σας επιτρέπει να ελέγξετε ποια αντικείμενα επιστρέφονται καθορίζοντας ποιες είναι οι "συνθήκες" για να χτενίζετε μέσω της βάσης δεδομένων σας και να περιορίζετε αυτό που επιστρέφεται. Για άλλη μια φορά ενθαρρύνω την ανάγνωση της τεκμηρίωσης Rails σχετικά με τις συνθήκες για πιο εξελιγμένα θέματα, αλλά θα αγγίξω τις βασικές περιπτώσεις χρήσης που είναι πιθανό να χρειαστείτε () για να καλύψετε.

Θα μπορούσατε να γράψετε τη σύνταξη ενός .de () αίτησης παρόμοια με τα προηγούμενα παραδείγματα μας, προκειμένου να εντοπίσουμε ΟΛΑ τις περιπτώσεις των επισκεπτών που ονομάζονται Michael J. Fox:

Ουάου, τώρα υπάρχουν ακόμα περισσότερα! Έχουμε τον Michael J. Fox τον ζωγράφο, και τον Michael J. Fox και τον μουσικό. Με μια απλή μέθοδο πήραμε μια σειρά από κάθε επισκέπτη με αυτό το όνομα - τι ένα ισχυρό εργαλείο!

Εδώ είναι όπου τα πράγματα γίνονται ενδιαφέροντα. Αν θέλετε να περάσετε πολλαπλές συνθήκες σε ένα ερώτημα .where (), η σύνταξη θα αλλάξει σε κάτι λιγότερο οικείο.

Εάν υπήρχαν πολλαπλές εμφανίσεις ηθοποιών που ονομάζονταν Michael J. Fox, θα μπορούσατε να φράσετε το ερώτημα παρομοίως σε ένα αίτημα .find_by ():

Ή θα μπορούσατε να το φράση πιο παρόμοια με SQL, όπως έτσι:

Αυτή η διατύπωση προτιμάται στις περισσότερες περιπτώσεις, καθώς η παράδοση των επιχειρημάτων έμμεσα μέσω του "s" επιτρέπει μεγαλύτερη ασφάλεια στις παραμέτρους σας και παρέχει ένα επίπεδο προστασίας από κακόβουλο κώδικα. Δεν είναι κάτι που πρέπει να ανησυχείτε για το δικαίωμα από το ρόπαλο κατά τη μάθηση, αλλά σημαντικό να έχουμε κατά νου.

Αν θελήσατε να ανακτήσετε όλες τις παρουσίες του Michael J. Fox του ηθοποιού ή του Michael J. Fox του αστροναύτη, θα μπορούσατε να συνδέσετε τα αιτήματα σας .where () μαζί για να δημιουργήσετε ένα πιο περίπλοκο ερώτημα:

Η αλυσίδα παρόμοιων αιτημάτων μαζί με το .or καθώς και η δυνατότητα αναζήτησης με χρήση ενός σιωπηρού και όπως αναφέρθηκε παραπάνω, δίνει .where () ένα ισχυρό βοηθητικό πρόγραμμα όταν πρόκειται για το χτένισμα μέσω της βάσης δεδομένων σας και την επιστροφή πολλαπλών παρουσιών τάξεων ακριβώς όπως τις χρειάζεστε .

Τώρα που έχουμε μάθει και τις τρεις από τις πιο πανταχού παρούσες μεθόδους ερωτήσεων στα Rails και ActiveRecord, το επόμενο βήμα είναι να τις εξασκηθείτε και να τις χρησιμοποιήσετε στις δικές σας εφαρμογές! Αναφερόμενος στην τεκμηρίωση Rails θα συνεχίσετε να παρέχετε καθοδήγηση και περαιτέρω ανασκόπηση στο ταξίδι σας. Καλή τύχη!