Hogyan működik a has_many :through asszociáció a gyakorlatban
On január 3, 2022 by adminAmikor a Rails-szel és az ActiveRecorddal kezdesz dolgozni, nehéz lehet eligazodni a has_many :through asszociációk koncepciójában, és ami még fontosabb, hogyan használhatod őket a Rails-alkalmazásodban.
“Tegyük fel, hogy van group, member, memberships…hogyan használhatom ezt a modellekben, vezérlőkben és nézetekben?”
“Has_many :through kapcsolatot használok, ami látszólag működik. Most szükségem van egy űrlapra, amelyet megjeleníthetek, hogy a felhasználók csatlakozhassanak a csoporthoz vagy kiléphessenek belőle.”
Először is, eléggé biztosnak kell lennie abban, hogy a has_many :through kapcsolat jó választás az alkalmazás tervezéséhez. Feltételezve, hogy így van, íme, hogyan ültetheted át a gyakorlatba.
Tegyük fel, hogy egy alkalmazást építesz Users és Groups kapcsolattal, és egy olyan űrlapot szeretnél létrehozni, ahol egy adott felhasználó bármelyik csoporthoz csatlakozhat vagy elhagyhatja azt. Úgy döntöttél, hogy a felhasználókat és a csoportokat a Membership táblán keresztül társítod.
A modelljeid így épülnek fel:
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
Mindig hasznosnak találom, mielőtt elkezdem írni a vezérlőket vagy a nézeteket, hogy átgondolom, mit akarok elérni, és a Rails konzol segítségével meggyőződöm arról, hogy jó úton járok. Más szóval, megpróbálok előállni egy végcéllal, majd a Rails konzol segítségével visszafelé haladva kitalálom a megoldásomat.
Azzal, hogy egy olyan űrlapot akarunk megjeleníteni, amely lehetővé teszi a felhasználó számára, hogy csatlakozzon egy csoporthoz vagy kilépjen belőle, fel kell tennünk magunknak a kérdést: “Mit jelent az, hogy egy felhasználó csatlakozzon egy csoporthoz?”.”
Az adatbázis szempontjából ez lényegében azt jelenti, hogy a Membership
táblában lesz egy sor, amelynek user_id
és group_id
oszlopai megfelelnek az adott felhasználónak és csoportnak. A mi feladatunk ezután az, hogy úgy hangszereljük a dolgokat, hogy amikor a felhasználó a ‘submit’ gombra kattint az űrlapon, a Membership
tábla egy új sort (vagy sorokat) kapjon a megfelelő user_id
és group_id
értékekkel.
A felhasználó számára megjelenített űrlapon/nézetben szükségünk van egy olyan módra, amellyel a felhasználó kiválaszthatja, hogy melyik csoporthoz szeretne csatlakozni. A vezérlőben pedig ki akarjuk vonni a felhasználó által az űrlapon tett választásokat, és ezeket a választásokat felhasználni új sorok létrehozására a Membership
táblában.
Először is, képzeljük el, hogy van egy user_id
és egy group_id
érték, hogyan hoznánk létre ezt az új sort a Membership táblában? Az ActiveRecord megkönnyíti ezt. Azt akarjuk tenni, hogy egy adott User
rekordhoz hozzáadunk egy ‘membership’-t, így amikor azt mondjuk, hogy @user.groups
, visszakapjuk a csoportok listáját, amely tartalmazza az imént hozzáadott csoportot. Ha ezt csináljuk:
#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
Ez a kódrészlet automatikusan létrehoz egy új sort a Membership táblában a megfelelő group_id
és user_id
értékekkel. És mostantól minden alkalommal, amikor a @user.groups
-t használja, visszakapja a hozzáadott csoportok listáját. A nagyobb biztonság kedvéért próbáld ki a fentieket a Rails konzolodban.
Az alábbi Rails útmutatóban további részleteket találsz arról, hogy az ActiveRecord milyen módszereket biztosít számodra, amikor a has_many :through
-t használod.
Feltételezem, hogy valamilyen típusú hitelesítést állítottál be az alkalmazásodban, ami hozzáférést biztosít a current_user
módszerhez. Szükségünk lesz erre a metódusra, hogy megkapjuk a user_id
-unkat, egy egyszerű current_user.id
híváson keresztül. Ha már megvan a felhasználó (valami @user = User.find(current_user.id)
-vel), akkor a fenti kódot használhatja a csoportok hozzáadásához.
A következő kérdés az, hogy hogyan írja meg a nézetét úgy, hogy az átadja a group_id
értékeket a vezérlőnek?
Az, hogy hogyan írja meg a nézetét, teljes mértékben attól függ, hogy a felhasználóitól milyen folyamatot vár el, és az alkalmazás egyéb tényezőitől. Tegyük fel, hogy úgy döntesz, hogy a felhasználónak egy listát adsz a jelölőnégyzetekből, amelyek felsorolják azokat a csoportokat, amelyekhez csatlakozhat vagy amelyekből kiléphet. Íme egy egyszerű módja ennek:
<% Group.all.each do |group| %> <%= check_box_tag "user", group.id, @user.group_ids.include?(group.id) %> <%= group.name %> <br /><% end %>
A check_box_tag
használata valószínűleg némi magyarázatra szorul.
Az első paraméter "user"
arra utasítja a Rails-t, hogy az összes ilyen azonosítóval rendelkező checkboxot csoportosítsa, és adja át a vezérlőnek egy Array-ként. Ez azt jelenti, hogy a vezérlődben megteheted a params
-t, és egy szép Ruby Array-t kapsz az összes group_ids
-ból, amit a felhasználó kiválasztott.
Az utolsó paraméter csak azt biztosítja, hogy minden olyan csoport, amelyhez a felhasználó jelenleg tartozik, ellenőrizve legyen, amikor az űrlap megjelenik.
A fentieknek el kell indítaniuk a has_many :through használatával a Rails alkalmazásodban, de attól függően, hogy mit csinál az alkalmazásod, elég biztos vagyok benne, hogy olyan problémákba fogsz ütközni, amelyek nem szerepelnek ebben a bejegyzésben. Szóval ha még mindig elakadtál, nézd meg a következőket:
1) Nézd meg ezt a csodálatos Rails castingot, amely végigvezet a has_many :through használatának teljes skáláján. Ha még nem tetted meg, nagyon ajánlom, hogy szerezz magadnak egy fiókot a RailsCasts-on.
2) Rails ActiveRecord Guide on has_many :through
Vélemény, hozzászólás?