ruby-on-rails - eliminar - hacer migraciones en rails
¿Debo crear manualmente una migración para una tabla de unión HABTM? (4)
Estoy luchando ahora para que HATBM funcione correctamente. Tengo un scanario golpeado: artículos y etiquetas. Supongo que HABTM debería usarse aquí, ya que es una relación de muchos a muchos. No obstante, no sé si debería crear manualmente una tabla de unión (articles_tags en este caso).
Mi código actualmente es el siguiente:
class Article < ActiveRecord::Base
has_and_belongs_to_many :tags
end
class Tag < ActiveRecord::Base
has_and_belongs_to_many :articles
end
Cuando ejecuto las migraciones, no se crea una tercera tabla. Además, me gustaría añadir que mi tercera tabla no tiene ninguna lógica de dominio, solo asignación ciega.
Estoy usando Rails 2.2.2
Debería hacer esto en una migración de una de las tablas, o en una migración separada si esas migraciones se han ejecutado:
create_table :articles_tags, :id => false do |t|
t.references :article, :tag
end
add_index :articles_tags, [:article_id, :tag_id]
Esto creará la tabla para usted y :id => false
le dice a Rails que no agregue un campo de id a esta tabla. También hay un índice que acelerará las búsquedas de esta tabla de unión.
También puede generar un modelo (ArticlesTag) para esto y hacer:
# 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
Y luego cree la tabla en la migración generada a partir de la script/generate model articles_tag
call.
En combinación con este Qeuestion (1st answear) Cómo configurar una relación típica entre los usuarios HABTM roles y 1st answear desde aquí, debe ser entendido incluso por un mono. Soy nuevo en RoR y funciona como un encanto
Probablemente también desee agregar un índice a la migración:
add_index "articles_tags", "article_id"
add_index "articles_tags", "tag_id"
Sin embargo, si desea la funcionalidad de etiquetado, le recomiendo el plugin acts_as_taggable_on rails:
http://www.intridea.com/tag/acts_as_taggable_on http://github.com/mbleigh/acts-as-taggable-on/
Lo he usado en un proyecto y fue muy fácil de implementar.
Uno de los problemas con una tabla de combinación para etiquetar es que puede ponerse feo creando una tabla de unión para cada tipo de contenido que desea que se pueda etiquetar (es decir, etiquetas_de_comentarios, etiquetas_de_descripciones, etiquetas_de_imágenes, etc.). Este complemento utiliza una tabla de etiquetas que incluye un discriminador para determinar el tipo de contenido sin la necesidad de una tabla de unión específica para cada tipo.
Tenga en cuenta que esto está cubierto en la API.