has_many: attraverso domande
-
19-09-2019 - |
Domanda
Sono stato in precedenza usando has_and_belongs_to_many, ed ho convertito in has_many: attraverso. Ecco come appare per una lista di giochi che possono avere molti utenti a giocare. Con questo, non posso fare game.users e user.games ....:
class Game < ActiveRecord::Base
has_many :game_users, :dependent => :destroy
has_many :users, :through => :game_users, :uniq => true
end
class User < ActiveRecord::Base
has_many :game_users, :dependent => :destroy
has_many :games, :through => :game_users, :uniq => true
end
class GameUser < ActiveRecord::Base
belongs_to :game
belongs_to :user
end
E la mia migrazione di database per la tabella join:
create_table :game_users, :id => false do |t|
t.column :game_id, :integer
t.column :user_id, :integer
t.column :player_index, :integer
end
Non sono del tutto sicuro di ottenere tutto questo, ti prego, aiutami controllare i miei fatti:
-
E 'la dipendente =>: distruggere corretta? Voglio che i '' game_users uniscono voce della tabella da eliminare se sia il gioco o l'utente viene distrutto? - ma non voglio che gli utenti cancellati se i giochi vengono cancellati e viceversa .....
-
Il campo uniq dovrebbe dire che i giochi contengono solo utenti unici, e gli utenti contengono solo giochi unici. E 'corretto?
-
La migrazione del database ha come prima: id => false. E 'ancora la cosa giusta da fare? Ho cercato nella console distruggere un gioco, ed ha ottenuto lamentele circa l'id mancante ... quindi immagino non e cercando di capire perché.
Trovo rotaie associazioni record attivo molto confuso. Immagino che non dovrebbero essere!
Soluzione
1: Sì, è corretto
2: Dal su uniq :
Se fosse vero, i duplicati saranno omessi dalla raccolta. utile in collaborazione con:. attraverso
Quindi, sì, se si mira non è ottenere lo stesso gioco nei giochi-collezione per l'utente né lo stesso utente a utenti-collezione di gioco, è corretto. E 'tutto spiegato href="http://blog.hasmanythrough.com/2006/5/6/through-gets-uniq" qui .
Non sarà, tuttavia, evitare che GameUsers duplicati in fase di creazione. Per questo, avresti bisogno di usare validates_ unicità _OF nel modello GameUser :
class GameUser < ActiveRecord::Base
validates_uniqueness_of :game_id, :scope => :user_id
end
3: No, non si vuole usare: id => false più. Passando dal has_and_belongs_to_many a has_many: attraverso, si è promosso il vostro molti-a-molti join-tabella per un modello completo - GameUser - che richiede il proprio id
.Anche se è vecchio, questo è ancora un buon articolo per has_many comprensione:. attraverso