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:

  1. 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 .....

  2. Il campo uniq dovrebbe dire che i giochi contengono solo utenti unici, e gli utenti contengono solo giochi unici. E 'corretto?

  3. 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!

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top