Perché ActiveRecord invece di un'API MySql
-
03-07-2019 - |
Domanda
Sto sviluppando applicazioni Web da un po 'di tempo e mi sento abbastanza a mio agio con mySql, in realtà come molti uso una qualche forma di SQL quasi ogni giorno. Mi piace la sintassi e ho zero problemi a scrivere query o ottimizzare le mie tabelle. Mi è piaciuto questo mysql api .
La cosa che mi ha infastidito è Ruby on Rails utilizza ActiveRecord e migra tutto in modo da utilizzare le funzioni per interrogare il database. Suppongo che l'idea di essere te "non debba mai più guardare SQL". Forse questo non è KISS (mantienilo stupido) ma l'interfaccia di ActiveRecord è davvero la migliore? Se sì, perché?
Lo sviluppo senza dover mai scrivere un'istruzione SQL è salutare? E se mai dovessi cercare qualcosa che non è già definito come una funzione di rotaie? So che hanno una funzione che mi permette di fare una query personalizzata. Immagino davvero che voglio sapere quali sono i vantaggi della gente nell'usare ActiveRecord su mySQL e se qualcuno si sente come me, forse questo sarebbe per la comunità delle rotaie ciò che il calcolatore era per la comunità matematica e alcune persone potrebbero dimenticare come fare a lungo divisione.
Soluzione
Hai ragione nel nascondere l'SQL dietro il livello di ActiveRecord significa che le persone potrebbero dimenticare di controllare l'SQL generato. Sono stato morso da questo stesso: indici mancanti, query inefficienti, ecc.
Ciò che ActiveRecord consente è semplificare le cose:
Post.find(1)
vs
SELECT * FROM posts WHERE posts.id = 1
Tu, lo sviluppatore, hai meno da scrivere e quindi hai meno possibilità di errore.
La convalida è un'altra cosa che ActiveRecord rende facile. Devi farlo comunque, quindi perché non avere un modo semplice per farlo? Con le parti ripetitive, noiose, sottratte?
class Post < ActiveRecord::Base
validates_presence_of :title
validates_length_of :title, :maximum => 80
end
vs
if params[:post][:title].blank? then
# complain
elsif params[:post][:title].length > 80 then
# complain again
end
Ancora una volta, facile da specificare, facile da convalidare. Vuoi più convalida? Una singola riga da aggiungere a un modello ActiveRecord. Il codice contorto con più condizioni è sempre più difficile da eseguire il debug e il test. Perché non semplificarti?
L'ultima cosa che mi piace di ActiveRecord invece di SQL sono i callback. I callback possono essere emulati con trigger SQL (che sono disponibili solo in MySQL 5.0 o versioni successive), mentre ActiveRecord ha avuto callback da allora (ho iniziato con 0.13).
Per riassumere:
- ActiveRecord semplifica le cose facili;
- ActiveRecord rimuove le parti noiose e ripetitive;
- ActiveRecord non ti impedisce di scrivere il tuo SQL ( di solito per motivi prestazionali) e infine;
- ActiveRecord è completamente portatile attraverso la maggior parte dei motori di database, mentre SQL stesso non lo è (a volte).
So che nel tuo caso stai parlando specificamente di MySQL, ma comunque. Avere l'opzione è piacevole.
Altri suggerimenti
L'idea qui è che inserendo la logica del DB all'interno dei tuoi Active Records, hai a che fare con il codice SQL in un posto, piuttosto che diffonderlo in tutta la tua applicazione. Ciò rende più semplice per i vari livelli dell'applicazione seguire il principio di responsabilità singola (che un oggetto dovrebbe avere solo un motivo per cambiare).
Evitare SQL ti aiuta quando decidi di cambiare lo schema del database. L'astrazione è anche necessaria per tutti i tipi di cose, come la validazione. Non voglio dire che non riesci a scrivere SQL: puoi sempre farlo se ne senti il ??bisogno. Ma non è necessario scrivere una query a 5 righe in cui tutto ciò che serve è user.save. È la filosofia delle rotaie per evitare codici inutili.