2009-11-10 11 views
6

Anteriormente estaba usando has_and_belongs_to_many, y he convertido a has_many: through. Así es como se ve una lista de juegos que pueden tener muchos usuarios jugando. Con esto, puedo hacer game.users y user.games ....:has_many: a través de las preguntas

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 

Y mi migración de base de datos para la tabla de unión:

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

No estoy muy seguro me sale todo esto, por favor, ayúdame a verificar mis datos:

  1. ¿Es dependiente =>: destruir correcto? Quiero que se elimine la entrada de la mesa de combinación 'game_users' si se destruye el juego o el usuario, pero no quiero que los usuarios se eliminen si se eliminan los juegos y viceversa .....?

  2. Se supone que el campo uniq indica que los juegos solo contienen usuarios únicos y que los usuarios solo contienen juegos únicos. ¿Es eso correcto?

  3. La migración de la base de datos como antes tiene: id => falso. ¿Sigue siendo lo correcto? Intenté en la consola destruir un juego y recibí quejas sobre la identificación que faltaba ... así que no estoy adivinando y tratando de entender por qué.

Encuentro rails active record associations very confusing. ¡Supongo que no se supone que lo sean!

+0

Su uso de: dependent =>: destroy es correcto. –

Respuesta

5

1: Sí, eso es correcto

2: Desde el documentation on uniq:

Si es verdad, los duplicados se omitirán de la colección. Útil en conjunción con: a través de.

Así que, sí, si su objetivo no es obtener el mismo juego en la colección de juegos del Usuario ni el mismo usuario en la colección de usuarios del Juego, eso es correcto. Todo se explica here.

No impedirá que se creen usuarios de juegos duplicados. Para ello, se necesitaría utilizar validates_ uniqueness _of en el GameUser modelo:

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

3: No, usted no desea utilizar: id => false más. Al pasar de has_and_belongs_to_many a has_many: through, ha promovido la tabla de varios miembros a un modelo completo, GameUser, que requiere su propia identificación.

Si bien es viejo, this sigue siendo un buen artículo para entender has_many: through.

Cuestiones relacionadas