Utilizarea asociatiilor de aliasare pentru dezvoltarea intuitiva: reflectii dintr-un proiect Rails

La crearea unei asociatii, ActiveRecord face aceste doua ipoteze:

In primul rand, numele clasei modelului catre care se refera asociatia dvs. se bazeaza direct pe numele asociatiei. De exemplu, daca imi scriu asociatia dupa cum urmeaza, ActiveRecord va cauta clasele numite Solicitant si Solicitant ca destinatar al asociatiei apartenentei la reuniune. omegle porno

clasa Intalnire <ApplicationRecord



apartine_to: solicitantului



appartine_to: solicitat



final

In al doilea rand, cheia externa din orice relatie de apartenenta_la va fi numita associationname_id. Aceasta inseamna, cum ar fi in exemplul de mai sus, ActiveRecord presupune ca tabela intalnirilor are o coloana requester_id care indica o tabela solicitant si o coloana requestee_id care indica o tabela solicitata.

Cu toate acestea, de multe ori trebuie sa ne infiintam asociatiile astfel incat un model sa poata face referire la un alt model cu doua nume diferite. le porno In exemplul meu de mai sus, atat solicitantul, cat si solicitantul sunt utilizatori stocati pe tabela utilizatorilor la care se face referire in modelul Utilizator. Prin urmare, un utilizator poate solicita intalniri (sa fie solicitantul) si sa primeasca cereri de intalnire (sa fie solicitantul). Pe de alta parte, o intalnire apartine unui solicitant si unui solicitant, ambii fiind utilizatori. porno escort

Aliasarea in modelul appartenenta la model

Asocierea din partea modelului intalnirii este o conexiune de baza unu-la-unu cu un element de aliasare:

# app / models /



meeting.rbclass Meeting <ApplicationRecord appartine_to: solicitant, class_name: ‘Utilizator’



apartine_to: solicitat, class_name: ‘Utilizator’

.. sophie davant porno . .. porno bizarre .



sfarsit

Definiti referinte in migrare

Pentru a aliasa un utilizator ca solicitant sau solicitant pe tabelul intalnirilor, referintele din tabelul de migrare ar putea arata ca mai jos:

clasa CreateMeetings <ActiveRecord :: Migrare



def change



create_table: meeting do | t |



t.references: solicitant, referinte:: utilizatori, straina_cheie: {to_table:: utilizatori}



t. little porno referente: solicitat, referinte:: utilizatori, strain_cheie: {to_table:: utilizatori}



end



end



end

Sintaxa foreign_key: {to_table:: association} asigura faptul ca coloanele: solicitant si: solicitant de pe tabelul intalnirilor nu cauta tabele cu numele „solicitant” si „solicitat”. Mai degraba, asociatia ar trebui sa indice de fapt tabelul utilizatorilor.

Aliasing in modelul has_many

In modelul Utilizator, nu putem folosi has_many: intalniri deoarece nu avem nicio coloana numita user_id in intalnirile de tabel. porno le coq Putem face referiri la intalniri ca „request_meetings” sau „requesting_meetings” astfel:

# app / models / user.rbclass User <ActiveRecord :: Base



has_many: requesting_meetings, class_name: „Intalnire”, foreign_key: „solicitant_id”



has_many: solicitat_meetings, class_name: „Intalnire”, foreign_key: „solicitant_id” .. porno thai .



Sfarsit

In acest fel, putem apela User.first. tiffany leiddi porno requested_meetings, precum si User.first.requesting_meetings. porno amateur mature De asemenea, putem defini o metoda de intalniri care returneaza combinatia de request_meetings si requesting_meetings.

Cu toate acestea, desi proiectul necesita o distinctie intre solicitanti si solicitati, nu necesita o distinctie intre intalnirile solicitate si intalnirile solicitate. Din punct de vedere al performantei, trebuie facute doua intrebari pentru a obtine intalnirile. porno cunilingus Prin urmare, am scris o metoda de clasa personalizata in modelul Utilizator astfel:

# app / models / user.rbclass User <ApplicationRecord



.. porno gay grosse bite . .. animaux porno . def meetings



Meeting.where („requester_id =? OR requestee_id =?”, id, id)



end . porno tuga .. . porno asmr ..



end

Stabiliti relatia in controler

Dupa ce asociatiile sunt infiintate in baza de date si modele, putem stabili cu usurinta relatia dintre intalniri, solicitanti si solicitanti. perfectgirl porno In proiectul meu, un administrator solicita intalniri cu utilizatori obisnuiti, care trimit bilete de asistenta si sunt mentionati ca „depunator”. Si un bilet de asistenta poate avea multe intalniri. In actiunea de creare a controlerului de intalnire, putem stabili cu usurinta relatia astfel:

# app / controllers / meetings_controller. porno young rbclass MeetingsController <ApplicationController ..



  • porno brigitte lahaie
  • public agent porno
  • video porno ado
  • tournage film porno
  • hijab porno
  • porno hot
  • porno doux
  • perfect porno
  • young porno
  • porno avec des animaux
  • porno marc dorcel
  • travesti porno
  • porno bande
  • porno drole
  • roman photo porno
  • xxl porno gratuit
  • rose valerie porno
  • 300 porno
  • porno militaire
  • video porno gay mature





. cap d’agde pornoporno petite bite def create



@meeting = @ ticket.meetings.build (meeting_params)



@ meeting. piscine porno requester = current_user



@ meeting.requestee = @ ticket.submitter if @meeting. salvati



MeetingMailer.meeting_schedule_notification (@meeting) .deliver_later



redirect_to @meeting, notice: „Intalnire solicitata”



altfel



redare:



sfarsit nou



sfarsit . .. . ..



sfarsit

Utilizati asociatii aliasate in vizualizari si mesaje de mail

Dupa ce solicitantul si solicitantul unei sedinte sunt stabiliti, putem prelua @ meeting. requester si @ meeting.requestee cu comoditate in punctele noastre de vedere si corespondenta. De exemplu, am configurat logica in intalnirile mele pentru a determina ce vizualizari sa redam in functie de relatia utilizatorului curent cu intalnirea.

# app / helpers / meetings_helper.rbmodule MeetingsHelper def set_meeting_with (meeting)



current_user == meeting.requester? meeting. requestee.name:



meeting.requester. name end def show_requestee_meeting_actions (intalnire)



returneaza doar daca current_user == meeting.requestee && meeting.requested? redare ‘intalniri / partajate / solicitari_actiuni’, intalnire: intalnire



sfarsit def show_requester_meeting_actions (intalnire)



returneaza cu exceptia cazului in care current_user == intalnire. requester redare ‘intalniri / partajare / cerere_actiuni ‘, intalnire: intalnire



sfarsit … … sfarsit

Acest lucru imi permite, de asemenea, confortul in mailers, unde am trecut doar prin argumentul intalnirii:

# app / mailers / meeting_mailer.rbclass MeetingMailer <ApplicationMailer



add_template_helper (MeetingsHelper) def meeting_schedule_notification (meeting)



@meeting =



mail de intalnire (catre: @ meeting.requestee. email, subiect: „#{@meeting.requester.name} A solicitat o intalnire Cu tine „)



sfarsit . .. . .. sfarsit

Sper sa utilizati asocierea aliasing ca unul dintre instrumentele dvs. de „automagic” furnizate de ActiveRecord ORM pentru a face interogarile de baza de date intuitive si convenabile in procesul dvs. de dezvoltare.