Un mod mai inteligent de a face relatii de la multi la multi in Ruby On Rails.
Introducere
Actualizare: acum functioneaza cu Rails 5
Aceasta tehnica este explicata cu mai multe detalii in aceasta postare.
Rails are doua moduri de a modela relatii de la mai multi la multi: has_and_belongs_to_many si has_many: through, aceasta bijuterie introduce o a treia: has_many_with_set.
has_many_with_set este echivalent cu has_and_belongs_to_many in functionalitate. Functioneaza numai atunci cand nu doriti informatii despre o relatie, dar relatia insasi, in spatele perdelelor, nu functioneaza la fel, has_many_with_set este mult mai eficienta in ceea ce priveste dimensiunea datelor, deoarece reduce redundanta care apare intr-un mediu -la multe relatii atunci cand cardinalitatea este scazuta, adica aceeasi combinatie apare de multe ori. De exemplu, intr-o aplicatie de blog, cand multe postari au aceleasi etichete.
Cum asa?
Modul obisnuit de a face relatii de la mai multi la multi este utilizarea unui tabel de asociere pentru a relationa doua tabele, ambele moduri de a face acest lucru in Ruby On Rails folosesc aceasta metoda, singura diferenta este gradul de control pe care ti-l dau pe „intermediar” tabel, unul iti ascunde (ceea ce este frumos), iar celalalt iti permite sa pui mai multe date in afara de relatie, sa folosesti validari, callback-uri etc.
Modelul tabelului de asociere este un mod foarte redundant de stocare a acestor relatii daca aceeasi combinatie se intampla de mai multe ori, deoarece trebuie sa creati aceleasi randuri de cantitate in tabelul de asociere de fiecare data cand salvati aceasta combinatie pentru fiecare parinte diferit .
De exemplu:
Deci, cream cinci etichete si cream 1000 de articole cu o combinatie aleatorie de etichete, nu este surprinzator faptul ca tabelul nostru de asociere are o multime de randuri pentru a reprezenta toate relatiile dintre articolele noastre si etichetele lor, daca acest lucru s-ar comporta liniar, daca am avea 1.000.000 de articole am avea 1.932.000 de randuri doar pentru a reprezenta relatia.
follando con mi amante porno gratis anal
follando en el campo me follo a mi madrastra
comic porno en español rusas desnudas
me follo a mi tia maduras en grupo
porno peludas orgias rusas
corridas en la garganta videos actrices españolas desnudas
gitanas follando chicas corriendose a chorros
como folla mi mujer sobar tetas
brutal tops follando en tenerife
sexo español gratis tetas en publico
descargar pelis pornos porno español años 70
milf camara oculta pollas corriendose
hentai en castellano videos x incesto
bbw abuelas mi mujer follando
travestis jovencitas abuelas ardientes
incestos lesbicos transexual española follando
muy jovencitas porno mamadas por dinero
tetonas delgadas maria patiño desnuda
follando en tenerife milfs españolas
folladas en el metro mamada a caballo
Acest exemplu (desi un pic nerealist) arata cat de redundant este acest lucru, chiar daca folosim aceeasi combinatie de etichete din nou si din nou, obtinem tot mai multe randuri, daca vorbim despre mii, nu este o mare problema, dar cand bazele de date cresc la sute de mii sau milioane, lucruri de acest gen incep sa conteze.
Aceasta este ceea ce remediaza aceasta bijuterie, asigurandu-va ca atunci cand creati o combinatie de articole, aceasta este unica si se foloseste de cate ori este nevoie atunci cand vi se solicita din nou, ca un set .
has-many-with-set este aici pentru a va ajuta.
Instalare
Sine 5.x
Pentru a-l utiliza, adaugati-l la fisierul dvs. Gem:
bijuterie „are-multe-cu-set”
Cam asta e tot!
Utilizare
Pentru a utiliza has-many-with-set pentru a raporta doua modele deja existente, trebuie sa creati tabelele subiacente care urmeaza sa fie utilizate de acesta, acest lucru se face foarte usor prin generarea unei migratii pentru acestea:
sinele genereaza has_many_with_set: migrare COPIL PARINT
Si adaugati relatia la modelul parinte:
Si asta e! Puteti incepe sa il utilizati in aplicatia dvs. Acest lucru se poate face pentru oricate modele doriti (trebuie sa creati migratii pentru toate combinatiile!) Puteti folosi chiar si mai multe seturi pentru a raporta date diferite la acelasi model parinte (cum ar fi Autori si etichete pentru articolele dvs.).
Exemplu
Folosind exemplul nostru anterior:
Acelasi exemplu ca inainte, chiar acum folosind has_many_with_set. Obtinem numarul impresionant de 80 de randuri pentru a reprezenta aceleasi informatii pe care le-am avut anterior cu mii de randuri (aproximativ aceleasi, deoarece folosim combinatii aleatorii nu este exact acelasi aspect articol / eticheta).
Lucrul amuzant din acest exemplu particular este ca, din moment ce avem doar cinci etichete, exista doar 32 de modalitati posibile de a combina cinci etichete impreuna, aceste 32 de combinatii se ridica la 80 de randuri in tabelul nostru de relatii …. adica, chiar daca aveam un milion de articole, am avea in continuare aceleasi 80 de randuri pentru a ne reprezenta relatiile, nu mai trebuie sa mai cream randuri !!
Observatii finale
Retineti ca has-many-with-set nu este lipsit de cateva avertismente:
- Poate fi utilizat numai atunci cand nu este nevoie sa introduceti informatii suplimentare in randurile de relatii, deoarece acestea sunt partajate intre multi parinti.
- Este eficient numai atunci cand exista o redundanta naturala ridicata in datele dvs., adica atunci cand multe seturi pot fi partajate intre multi parinti.
- Desi interogarile de recuperare sunt aceleasi ca si pentru has_and_belongs_to_many si nu au niciun cost suplimentar, are un cost suplimentar mic atunci cand salvam sau actualizam, deoarece trebuie sa gasim sau sa cream un set adecvat inainte de a salva efectiv inregistrarea parinte in baza de date. Acest cost este probabil neglijabil, spre deosebire de scris tot timpul, dar nu pot spune ca este gratuit.
Aceasta este o umila incercare de a face Ruby On Rails un pic mai util cu seturi de date si aplicatii mari, sper sa va placa si va este util, va rog sa-mi trimiteti un e-mail cu comentarii sau sugestii (sau chiar cod!).
Autor
- Francisco Soto [email protected]
Drepturi de autor © 2012 Francisco Soto (http://ebobby.org) eliberat sub licenta MIT.








