Rails has_and_belongs_to_many me confusion avec des installations et des usines
-
13-09-2019 - |
Question
Confusion générale J'ai des groupes qui peuvent avoir 3 genres. Je lis dans un précédent SO afficher la bonne façon de gérer cela est de quelques pas:
1) En band.rb
has_and_belongs_to_many :genres
2) Créer une table de jointure band_genres
Même après avoir lu la documentation, je suis un peu confus quant à ce HABTM signifie réellement. Je suppose que je pense juste normalement « un groupe a beaucoup de genres », a pas et appartient à beaucoup. Donc, une explication rapide de bas Dumbed ce serait génial.
Confusion avec Fixtures
En outre, lorsque vous faites mon appareil pour band_genres je
{
"The Reaper Band and Funk": { "band": "The Reaper Band", "genre": "Funk" },
"The Reaper Band and Rock": { "band": "The Reaper Band", "genre": "Rock" }
}
Et je reçois une colonne de bande « inconnue ». Je pensais que des rails était censé savoir que « The Band Reaper » se réfère à une bande d'un dispositif de bande (même nom bien sûr) et saisirait que id et savoir que « bande » dans cet appareil se réfère à band_id dans la table de jointure . Je préférerais mes appareils ressembler à ceci que d'avoir des chiffres codés dur.
Confusion avec des usines
Quand je crée un groupe dans mon usine, je veux assigner genres:
Factory.define :band do |f|
f.sequence(:name) { |n| "Band#{n}" }
f.mailing_lists { |mailing_lists| [mailing_lists.association(:mailing_list)] }
f.genres 2
end
Je me rends compte ici, je serais probablement besoin d'un genre_id codé en dur. Mais pourquoi ne regarde pas les rails à cela et dire « oh, il veut ajouter genre avec id = 2 à la table band_genres ».
Je ne m'y attendais pas des rails pour prendre soin de tout le sale boulot pour moi, mais je ne veux jouer par les règles.
La solution
- A et appartient à un grand nombre définit la relation dans les deux sens. Si vous avez seulement besoin de voir ce que les genres de la bande appartient, has_many sera très bien. Si vous voulez savoir quels groupes sont « funk », vous pouvez utiliser HABTM pour permettre une recherche de bandes pour un genre donné.
- Pour les luminaires, dans des rails, vous pouvez maintenant faire HABTM sans créer un appareil séparé pour la table de jointure. Par exemple:
bands.yml:
reaper_band:
name: The Reaper Band
genres: funk, rock
genres.yml:
funk:
name: Funk
bands: reaper_band
rock:
name: Rock
bands: reaper_band