2016-12-20 1 views
0

Je travaille sur un projet de labyrinthe dans les rails, et ironiquement, je me suis perdu. Jusqu'à présent, je suis assez nouveau avec has_many_though les relations entre les modèles, et si un modèle a beaucoup de lui-même à travers quelque chose? Fondamentalement, chaque Room a beaucoup de Rooms. J'ai créé un modèle Tunnel pour connecter ces pièces, afin qu'une pièce soit connectée à beaucoup d'autres par des tunnels. Mais il devient plus difficile quand il s'agit de construire ces relations.has_many de lui-même si

class Room < ApplicationRecord 

    has_many :tunnels 
    has_many :rooms, through: :tunnels 

end 

Et mon tunnel arrive à relier deux chambres

class Tunnel < ApplicationRecord 
    belongs_to :lemmin_room, :foreign_key => "room1_id" 
    belongs_to :lemmin_room, :foreign_key => "room2_id" 
end 

documentation Rails est assez clair quand il vient orteil modela a beaucoup Model B à ModelC, mais je ne pense pas qu'il parle jamais modela = ModelB.

+0

Cette relation est-elle unidirectionnelle (une pièce a beaucoup d'autres pièces dans un tunnel, mais peut-être que si je suis dans l'une de ces pièces, je ne peux pas retourner à la pièce précédente par le même tunnel? une relation en miroir (une pièce A connectée à une autre pièce B peut être obtenue à partir de B via le même tunnel)? – guiniveretoo

+0

Je peux retourner dans la pièce précédente par le même tunnel si nécessaire, oui. –

Répondre

0

Vous devez définir deux belongs_to association avec le nom différent, comme:

class Tunnel < ApplicationRecord 
    belongs_to :lemmin_room_1, :foreign_key => "room1_id" 
    belongs_to :lemmin_room_2, :foreign_key => "room2_id" 
end 

Ensuite, dans votre modèle Room:

class Room < ApplicationRecord 
    has_many :tunnels 
    has_many :rooms, through: :tunnels, source: :lemmin_room_1 
end 

Vous pouvez spécifier source pour obtenir ce que les chambres que vous voulez dans Tunnel .