Нужно ли вручную создавать миграцию для таблицы соединений HABTM? - PullRequest
77 голосов
/ 19 февраля 2009

Я изо всех сил сейчас пытаюсь заставить HATBM работать правильно. У меня есть битый сканарио: статьи и теги. Я предполагаю, что здесь следует использовать HABTM, так как это отношение многие ко многим. Однако я не знаю, нужно ли мне вручную создавать таблицу соединений (в данном случае article_tags).

Мой код в настоящее время выглядит следующим образом:

class Article < ActiveRecord::Base
  has_and_belongs_to_many :tags  
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :articles
end

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

Я использую Rails 2.2.2

Ответы [ 4 ]

140 голосов
/ 19 февраля 2009

Вы должны сделать это при миграции одной из таблиц или при отдельной миграции, если эти миграции были выполнены:

create_table :articles_tags, :id => false do |t|
  t.references :article, :tag
end

add_index :articles_tags, [:article_id, :tag_id]

Это создаст таблицу для вас, а :id => false скажет Rails не добавлять поле id в эту таблицу. Также есть индекс, который ускорит поиск этой таблицы соединений.

Вы также можете сгенерировать модель (ArticlesTag) для этого и сделать:

# article.rb
has_many :articles_tags
has_many :tags, :through => :articles_tags

# tag.rb
has_many :articles_tags
has_many :articles, :through => :articles_tags

# article_tag.rb
belongs_to :tag
belongs_to :article

А затем создайте таблицу в миграции, сгенерированной из вызова script/generate model articles_tag.

8 голосов
/ 08 марта 2011

Обратите внимание, что это рассматривается в API.

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_and_belongs_to_many

7 голосов
/ 26 февраля 2009

Возможно, вы также хотите добавить индекс к миграции:

add_index "articles_tags", "article_id"

add_index "articles_tags", "tag_id"

Однако, если вам нужна функциональность тегирования, я бы порекомендовал плагин activ_as_taggable_on rails:

http://www.intridea.com/tag/acts_as_taggable_on http://github.com/mbleigh/acts-as-taggable-on/

Я использовал его в проекте, и его было очень легко реализовать.

Одна из проблем, связанных с таблицей соединений для тегирования, заключается в том, что создание таблицы объединения для каждого типа контента, который вы хотите сделать тегируемым (например, comments_tags, posts_tags, images_tags и т. Д.), Может привести к уродливости. Этот плагин использует таблицу тегов, которая включает в себя дискриминатор для определения типа контента без необходимости специальной таблицы соединений для каждого типа.

1 голос
/ 19 сентября 2012

В сочетании с этим Qeuestion (1-й ответ) Как установить типичное отношение ролей пользователей HABTM и 1-й ответ отсюда, это должно быть понято даже обезьяной. Я новичок в RoR, и он работает как шарм

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...