Rotaie relazioni ActiveRecord - ha molti ed appartiene ad associazioni
-
19-09-2019 - |
Domanda
Ho creato 3 modelli:
- Articolo: contiene un articolo
- Tag: contiene i tag
- ArticleTag: significava per associare una relazione molti-a-uno tag relazione articolo. Esso contiene una tag_id ed un article_id.
Il problema che sto avendo è che io sono abbastanza nuovo per la tecnologia record attivo e non capisco il modo corretto di definire tutto. Attualmente, che credo sia sbagliato, è che ho un
ArticleTag
belongs_to :article
belongs_to :tag
Ora, da qui il mio pensiero è stato quello di aggiungere
Article
:has_many :tag
Non sono sicuro se im affrontare questo correttamente a tutti. Grazie per l'aiuto!
Soluzione
Dipende se si desidera un join modello o no. Un modello di unirsi consente di tenere le informazioni supplementare contro l'associazione tra altri due modelli. Per esempio, forse si desidera registrare un timestamp di quando l'articolo è stato etichettato. Tale informazione sarebbe stato registrato contro il modello unirsi.
Se non si desidera un modello unirsi, allora si potrebbe utilizzare una semplice associazione has_and_belongs_to_many
:
class Article < ActiveRecord::Base
has_and_belongs_to_many :tags
end
class Tag < ActiveRecord::Base
has_and_belongs_to_many :articles
end
Con un Tagging
join modello (che è un nome migliore di ArticleTag
), sarebbe simile a questa:
class Article < ActiveRecord::Base
has_many :taggings
has_many :tags, :through => :taggings
end
class Tag < ActiveRecord::Base
has_many :taggings
has_many :articles, :through => :taggings
end
class Tagging < ActiveRecord::Base
belongs_to :article
belongs_to :tag
end
Altri suggerimenti
Si dovrebbe utilizzare has_many
quando la relazione è a senso unico. Un articolo ha molti tag, ma i tag sono anche molti articoli, in modo che non è abbastanza di destra. Una scelta migliore potrebbe essere has_and_belongs_to_many
: un articolo ha molti tag, e quelle etichette di riferimento anche articoli. A belongs_to B
significa che un riferimento B; A has_one B
significa che fa riferimento a un B.
Ecco una sintesi dei rapporti si potrebbe vedere:
Article
has_and_belongs_to_many :tags # An article has many tags, and those tags are on
# many articles.
has_one :author # An article has one author.
has_many :images # Images only belong to one article.
belongs_to :blog # This article belongs to one blog. (We don't know
# just from looking at this if a blog also has
# one article or many.)
Al largo della parte superiore della mia testa, l'articolo dovrebbe essere:
has_many :article_tags
has_many :tags, :through => :article_tags