Frage

Ich war vorher mit has_and_belongs_to_many und haben has_many umgesetzt: durch. Hier ist, wie es für eine Liste der Spiele sieht, dass viele Benutzer zu spielen haben. Damit kann ich game.users und user.games tun ....:

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

Und meine Datenbank-Migration für die Join-Tabelle:

create_table :game_users, :id => false do |t|
      t.column :game_id, :integer
      t.column :user_id, :integer
      t.column :player_index, :integer
    end

Ich bin nicht ganz sicher, ob ich das alles bekommen, bitte helfen Sie mir meine Fakten überprüfen:

  1. Ist das abhängige =>: correct zerstören? Ich mag die ‚game_users‘ Tabelleneintrag beitreten gelöscht werden, wenn entweder das Spiel oder der Benutzer zerstört wird - aber ich will nicht, Benutzer gelöscht werden, wenn Spiele gelöscht werden und umgekehrt .....

  2. Das uniq Feld soll sagen, dass Spiele nur einzelne Nutzer enthalten, und die Benutzer enthalten nur einzigartige Spiele. Ist das richtig?

  3. Die Datenbankmigration nach wie vor hat: id => false. Ist das immer noch das Richtige zu tun? Ich habe versucht, in der Konsole ein Spiel zu zerstören, und bekam Beschwerden über die fehlende id ... so vermute ich nicht und versuchen zu verstehen, warum.

Ich finde Schienen aktiven Datensatz Verbände sehr verwirrend. Ich denke, sie sind nicht sein soll!

War es hilfreich?

Lösung

1: Ja, das ist richtig

2: Von der Dokumentation auf uniq :

  

Wenn das stimmt, werden Duplikate weggelassen werden   aus der Sammlung. nützlich in   Verbindung mit:. durch

Also, ja, wenn Du ist nicht das Ziel das gleiche Spiel in User-Spiele-Sammlung erhält noch den gleichen Benutzer in Spiel Nutzer-Sammlung, das ist richtig. Es ist alles hier erklärt.

Es wird jedoch nicht verhindern, dass doppelte GameUsers aus erstellt werden. Dafür müssen Sie validates_ Einzigartigkeit _of im GameUser-Modell verwenden, :

class GameUser < ActiveRecord::Base
  validates_uniqueness_of :game_id, :scope => :user_id
end

3: Nein, Sie möchten nicht verwenden: id => false mehr. Durch die von has_and_belongs_to_many Umstellung auf has_many: durchgehend, haben Sie gefördert Ihre many-to-many-join-Tabelle zu einem vollständigen Modell - GameUser - das seine eigenen ID erfordert

.

Während es alt ist, diese ist immer noch ein guter Artikel für Verständnis has_many. durch

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top