Miten has_many :through -assosiaatio toimii käytännössä
On 3 tammikuun, 2022 by adminKun alat työskennellä Railsin ja ActiveRecordin parissa, voi olla vaikeaa ymmärtää has_many :through -assosiaatioiden käsitettä ja ennen kaikkea sitä, miten niitä voidaan käyttää Rails-sovelluksessa.
”sanotaan, että minulla on group, member, memberships…miten minä sitten oikeastaan KÄYTÄN tätä malleissani, ohjaimissani ja näkymissäni?”
”Käytän has_many :through-suhdetta, joka näyttää toimivan. Tarvitsen nyt lomakkeen, jonka voin renderöidä, jotta käyttäjät voivat liittyä ryhmään tai poistua siitä.”
Aluksi sinun pitäisi olla kohtuullisen varma siitä, että has_many :through -yhteys on hyvä valinta sovelluksesi suunnitteluun. Olettaen, että olet, seuraavassa kerrotaan, miten voit toteuttaa sen käytännössä.
Esitettäkö, että rakennat sovellusta, jossa on Users ja Groups, ja haluat rakentaa lomakkeen, jossa tietty käyttäjä voi liittyä mihin tahansa ryhmään tai poistua siitä. Olet päättänyt yhdistää käyttäjät ja ryhmät taulukon Membership kautta.
Mallisi rakentuvat näin:
class User < ActiveRecord::Base has_many :memberships has_many :groups, through: :membershipsendclass Group < ActiveRecord::Base has_many :memberships has_many :users, through: :membershipsendclass Membership < ActiveRecord::Base belongs_to :user belongs_to :groupend
Minusta on aina hyödyllistä ennen kuin alan kirjoittaa kontrollereita tai näkymiä, miettiä, mitä haluan saavuttaa, ja käyttää Rails-konsolia varmistaakseni, että olen oikealla tiellä. Toisin sanoen, yritän keksiä päämäärän, ja työskentelen sitten taaksepäin Rails-konsolin avulla selvittääkseni ratkaisuni.
Jos siis haluamme renderöidä lomakkeen, jonka avulla käyttäjä voi liittyä ryhmään tai poistua ryhmästä, meidän pitäisi kysyä itseltämme: ”Mitä tarkoittaa, että käyttäjä liittyy ryhmään?”.”
Tietokannan kannalta se tarkoittaa lähinnä sitä, että Membership
-taulussa on rivi, jonka sarakkeet user_id
ja group_id
vastaavat annettua käyttäjäämme ja ryhmäämme. Tehtävämme on sitten järjestää asiat niin, että kun käyttäjä napsauttaa lomakkeella ’lähetä’, Membership
-taulukkoon tulee uusi rivi (tai rivejä), jossa on oikeat user_id
– ja group_id
-arvot.
Lomakkeessa/näkymässä, jonka renderöimme käyttäjälle, tarvitsemme tavan, jolla käyttäjä voi valita, mihin ryhmiin hän haluaa liittyä. Ja ohjaimessa haluamme poimia käyttäjän lomakkeessa tekemät valinnat ja käyttää näitä valintoja uusien rivien luomiseen Membership
-taulukkoon.
Aluksi, kuvittele, että sinulla olisi user_id
ja group_id
, miten loisit tuon uuden rivin Membership-taulukkoon? ActiveRecord tekee siitä helppoa. Haluamme lisätä tietylle User
-tietueelle ’jäsenyyden’, jotta kun sanomme @user.groups
, saamme takaisin luettelon ryhmistä, joka sisältää juuri lisäämämme ryhmän. Jos teet näin:
#assuming @user is your User [email protected] << Group.find(group_id)#if you have a list of group_ids(something like ), you can also do:@user.group_ids << group_ids
Tämä koodinpätkä luo automaattisesti uuden rivin Membership-taulukkoon oikeilla group_id
ja user_id
. Ja nyt aina kun käytät @user.groups
, saat takaisin luettelon lisäämistäsi ryhmistä. Lisää varmuutta saat kokeilemalla edellä esitettyä Rails-konsolissasi.
Lue alla olevasta Rails-oppaasta lisätietoja siitä, mitä metodeja ActiveRecord tarjoaa sinulle, kun käytät has_many :through
.
Oletan, että sovelluksessasi on käytössäsi jonkinlainen todennus, joka antaa sinulle pääsyn current_user
-metodiin. Tarvitsemme tätä metodia saadaksemme user_id
:n yksinkertaisen current_user.id
-kutsun kautta. Kun sinulla on käyttäjä (jolla on jotain @user = User.find(current_user.id)
), voit käyttää yllä olevaa koodia ryhmien lisäämiseen.
Seuraava kysymys on, miten kirjoitat näkymän niin, että se välittää group_id
-arvot kontrollerille?
Miten kirjoitat näkymän, riippuu täysin siitä, millaisen virtauksen odotat käyttäjiesi läpikäyvän, ja muista sovelluksesi tekijöistä. Oletetaan, että päätät antaa käyttäjällesi luettelon valintaruuduista, joissa luetellaan ryhmät, joihin hän voi liittyä tai joista hän voi poistua. Tässä on yksinkertainen tapa toteuttaa tämä:
<% Group.all.each do |group| %> <%= check_box_tag "user", group.id, @user.group_ids.include?(group.id) %> <%= group.name %> <br /><% end %>
check_box_tag
:n käyttö kaipaa luultavasti selitystä.
Ensimmäinen parametri "user"
kertoo Railsille, että se ryhmittelee kaikki tällä ID:llä varustetut valintaruudut yhteen ja välittää ne kontrollerille Arrayina. Tämä tarkoittaa sitä, että kontrollerissasi voit tehdä params
ja saada mukavan Ruby Array:n kaikista group_ids
, jotka käyttäjä valitsi.
Viimeinen parametri vain varmistaa, että kaikki ryhmät, joihin käyttäjä tällä hetkellä kuuluu, tarkistetaan, kun lomake renderöidään.
Ylläolevan pitäisi saada sinut liikkeelle has_many :n käyttämisestä Rails-sovelluksessasi, mutta riippuen siitä, mitä sovelluksessasi tehdään, olen melko varma, että tulet törmäämään ongelmiin, joita ei käsitellä tässä kirjoituksessa. Joten jos olet vielä jumissa, tutustu seuraaviin:
1) Tutustu tähän hämmästyttävään Rails-valokuvaan, jossa käydään läpi koko has_many :through:n käytön skaala. Jos et vielä ole, suosittelen lämpimästi, että hankit itsellesi tilin RailsCasteihin.
2) Rails ActiveRecord Guide on has_many :through
Vastaa