2010-05-06 10 views

risposta

91

Per quanto posso ricordare, has_and_belongs_to_many offre una tabella di ricerca semplice che fa riferimento ai due modelli.

Per esempio,

storie possono appartenere a molte categorie. Le categorie possono avere molte storie.

Categories_Stories Table 
story_id | category_id 

has_many :through ti dà un terzo modello che può essere utilizzato per memorizzare vari altri pezzi di informazioni che non appartengono a uno dei modelli originali.

Per esempio

persona può sottoscrivere molte riviste. Le riviste possono avere molti abbonati.

Quindi, possiamo avere un modello di sottoscrizione nel mezzo, che ci dà una tabella simile all'esempio precedente, ma con proprietà aggiuntive.

Subscriptions Table 
person_id | magazine_id | subscription_type | subscription_length | subscription_date 

E così via.

+24

nota che la tabella deve essere denominata in ordine alfabetico, vale a dire tabella categorie_storie in contrapposizione a storie_categorie: questa è la convenzione che lo fa funzionare. – Will

+0

Grazie, ho cambiato il mio post ora – Dan

+0

perché devono essere alfabetici? – ctilley79

30

Da http://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many

La regola più semplice generale è che si dovrebbe impostare un has_many: attraverso la relazione, se avete bisogno di lavorare con il modello di relazione come entità indipendente. Se non è necessario fare nulla con il modello di relazione, potrebbe essere più semplice impostare una relazione has_and_belongs_to_many (anche se sarà necessario ricordare di creare la tabella di join nel database). È necessario utilizzare has_many: through se sono necessarie convalide, callback o attributi aggiuntivi nel modello di join.

+3

Vorrei anche aggiungere che ci sono molti metodi che i binari inseriscono in has_and_belongs_to_many e non in has_many: through .Tutti i metodi come l'assegnazione di una raccolta di valori all'associazione, non sembrano mostrare nella documentazione per has_many: attraverso http://guides.rubyonrails.org/association_basics.html#has_and_belongs_to_many-association-reference – e3matheus

13

La mia regola generale è, posso ottenere con un elenco di caselle qui? Se è così, allora è un'associazione di habtm. Se ho bisogno della casella di controllo per acquisire più informazioni sulla relazione rispetto al semplice sì/no, allora usa has_many: through. HABTM è semplice come usare il metodo _id con una semplice collezione_check_boxes. Has_many: attraverso spesso implica accept_nested_attributes_for.

4

È necessario utilizzare has_many: through se sono necessarie convalide, callback o attributi aggiuntivi sul modello di join.

Problemi correlati