Rails отношения ActiveRecord - имеет много и принадлежит ассоциациям - PullRequest
4 голосов
/ 15 декабря 2009

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

  • Статья: содержит статью
  • Метка: содержит метки
  • ArticleTag: предназначен для связи тегов «многие к одному» со связью статей. Содержит тег_ид и идентификатор_сталии.

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

ArticleTag
 belongs_to :article
 belongs_to :tag

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

  Article
   :has_many :tag

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

Ответы [ 3 ]

10 голосов
/ 15 декабря 2009

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

Если вам не нужна модель объединения, вы можете использовать простую 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
5 голосов
/ 15 декабря 2009

Вы должны использовать 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.)
0 голосов
/ 15 декабря 2009

с макушки головы, статья должна быть:

has_many :article_tags
has_many :tags, :through => :article_tags
...