Rails отношения ActiveRecord - имеет много и принадлежит ассоциациям

Я создал 3 модели:

  • Статья: содержит статью
  • Тег: содержит теги
  • ArticleTag: предназначен для связывания тегов "многие к одному" со статьей. Он содержит tag_id и article_id.

У меня проблема в том, что я довольно новичок в технологии активной записи и не понимаю, как правильно все определять. В настоящее время, что я считаю неправильным, это у меня есть

ArticleTag
 belongs_to :article
 belongs_to :tag

Теперь отсюда моя мысль была тогда добавить

  Article
   :has_many :tag

Я не уверен, правильно ли я подхожу к этому. Спасибо за помощь!

3 ответа

Решение

Это зависит от того, хотите ли вы модель соединения или нет. Модель соединения позволяет хранить дополнительную информацию относительно связи между двумя другими моделями. Например, возможно, вы хотите записать отметку времени, когда статья была помечена. Эта информация будет записана по модели соединения.

Если вы не хотите модель соединения, то вы можете использовать простую 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

С Tagging присоединиться к модели (это лучшее имя, чем ArticleTag), это будет выглядеть так:

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

Вы должны использовать has_many когда отношения односторонние. У статьи есть много тегов, но у тегов также есть много статей, так что это не совсем верно. Лучший выбор может быть has_and_belongs_to_many: статья имеет много тегов, и эти теги также являются ссылочными статьями. A belongs_to B означает, что A ссылается на B; A has_one B означает, что B ссылается на A.

Вот краткое изложение отношений, которые вы можете увидеть:

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.)

Вне головы, статья должна быть:

has_many :article_tags
has_many :tags, :through => :article_tags
Другие вопросы по тегам