Los carriles has_and_belongs_to_many me está confundiendo con instalaciones y fábricas
-
13-09-2019 - |
Pregunta
Confusión general
Tengo bandas que pueden tener 3 géneros. He leído en un anterior para enviar que la adecuada manera de manejar esto es un par de pasos:
1) En band.rb
has_and_belongs_to_many :genres
2) Crear una tabla de unión band_genres
Incluso después de leer la documentación, estoy un poco confundido en cuanto a lo que significa en realidad HABTM. Supongo que sería normalmente solo pensar en "una banda tiene muchos géneros", no tiene y pertenece a muchos. Por lo que una rápida explicación callados de que sería grande.
confusión con Calendario
Además, al hacer mi accesorio para band_genres tengo
{
"The Reaper Band and Funk": { "band": "The Reaper Band", "genre": "Funk" },
"The Reaper Band and Rock": { "band": "The Reaper Band", "genre": "Rock" }
}
Y consigo una columna de banda "desconocido". Pensé rieles se supone que deben saber que "The Reaper Band" se referiría a una banda de un dispositivo de banda (mismo nombre, por supuesto) y que agarrar ese Identificación y saber que "banda" en este accesorio se referiría a band_id en la tabla de unión . Yo prefiero mis accesorios de tener este aspecto que tienen números duro codificado.
Confusión con las fábricas
Cuando creo una banda en mi fábrica, quiero asignarle Géneros:
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
Me doy cuenta aquí que probablemente necesitará un genre_id duro codificado. Pero ¿por qué no raíles que miran y dicen "oh, que quiere añadir género con id = 2 a la mesa band_genres".
No estoy esperando carriles para cuidar de todo el trabajo sucio para mí, pero quiero jugar por las reglas.
Solución
- tiene y pertenece a muchos define la relación en ambas direcciones. Si sólo necesita para ver lo que la banda géneros pertenece, has_many va a estar bien. Si desea saber qué bandas son "Funk", puede utilizar HABTM para permitir una búsqueda de bandas de un género determinado.
- Para los accesorios, en los carriles ahora se puede hacer HABTM sin crear un dispositivo separado para la tabla de unión. Por ejemplo:
en bands.yml:
reaper_band:
name: The Reaper Band
genres: funk, rock
en genres.yml:
funk:
name: Funk
bands: reaper_band
rock:
name: Rock
bands: reaper_band