Trilhos has_and_belongs_to_many está me confundindo com luminárias e fábricas
-
13-09-2019 - |
Pergunta
confusão geral
Eu tenho bandas que podem ter 3 gêneros. Eu li em um anterior SO pós que o bom maneira de lidar com isso é algumas etapas:
1) Em band.rb
has_and_belongs_to_many :genres
2) Criar um band_genres unir a tabela
Mesmo depois de ler a documentação, estou um pouco confuso quanto ao que HABTM realmente significa. Eu acho que eu só iria normalmente pensamos "a banda tem muitos gêneros", não tem e pertence a muitos. Assim, uma rápida idiotizadas explicação do que seria ótimo.
Confusão com equipamentos
Além disso, ao fazer a minha fixação para band_genres Tenho
{
"The Reaper Band and Funk": { "band": "The Reaper Band", "genre": "Funk" },
"The Reaper Band and Rock": { "band": "The Reaper Band", "genre": "Rock" }
}
E eu recebo um "desconhecido" coluna banda. Pensei trilhos deveria saber que "The Reaper Band" remete para uma banda a partir de um dispositivo elétrico banda (mesmo nome, é claro) e iria pegar esse id e saber que "banda" neste dispositivo elétrico remete para band_id na tabela de associação . Eu prefiro meus luminárias parecido com isso do que ter números codificados.
Confusão com fábricas
Quando eu criar uma banda na minha fábrica, eu quero atribuí-lo 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
Eu percebo aqui eu provavelmente iria precisar de um genre_id codificado duro. Mas por que não trilhos olhar para isso e dizer "oh, ele quer adicionar gênero com id = 2 para a mesa de band_genres".
Eu não estou esperando trilhos para cuidar de todo o trabalho sujo para mim, mas eu quero jogar pelas regras.
Solução
- Tem e pertence a muitos define a relação em ambas as direções. Se você só precisa ver o que genres da banda pertence, has_many vai ficar bem. Se você quer saber o que as bandas são "funk", você pode usar HABTM para permitir uma pesquisa de bandas para um determinado gênero.
- Para luminárias, em trilhos agora você pode fazer HABTM sem criar um acessório separado para a tabela de junção. Por exemplo:
em bands.yml:
reaper_band:
name: The Reaper Band
genres: funk, rock
em genres.yml:
funk:
name: Funk
bands: reaper_band
rock:
name: Rock
bands: reaper_band