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!

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top