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