Para crear un hashman multimórfico: a través, primero debe crear sus modelos. Usaremos 'Artículo', '' Categoría 'y' Etiqueta ', donde' Etiqueta 'es el modelo de unión y Artículo es uno de muchos objetos que pueden ser' etiquetados 'con una categoría.
Primero crea sus modelos 'Artículo' y 'Categoría'. Estos son los modelos básicos que no necesitan ninguna atención especial, por el momento:
rails g model Article name:string
rails g model Category name:string
Ahora, vamos a crear nuestra polimórfica unirse a la mesa:
rails g model Tag taggable_id:integer taggable_type:string category_id:integer
El-tabla de unión une dos tablas, o en nuestro caso una tabla a muchas otras a través de un comportamiento polimórfico. Lo hace almacenando la ID de dos tablas separadas. Esto crea un enlace. Nuestra tabla de 'Categoría' siempre será una 'Categoría' por lo que incluimos 'category_id'. Las tablas a las que se vincula varían, por lo que agregamos un elemento 'taggable_id' que contiene la identificación de cualquier elemento etiquetable. Luego, usamos 'taggable_type' para completar el enlace, lo que permite que el enlace sepa a qué está vinculado, como un artículo.
Ahora, tenemos que configurar nuestros modelos:
class Article < ActiveRecord::Base
has_many :tags, :as => :taggable, :dependent => :destroy
has_many :categories, :through => :tags
end
class Category < ActiveRecord::Base
has_many :tags, :dependent => :destroy
has_many :articles, :through => :tags, :source => :taggable, :source_type => 'Article'
end
class Tag < ActiveRecord::Base
belongs_to :taggable, :polymorphic => true
belongs_to :category
end
Después de esto, la configuración de la base de datos mediante:
rake db:migrate
eso es todo!Ahora, puede configurar su base de datos con datos reales:
Category.create :name => "Food"
Article.create :name => "Picking the right restaurant."
Article.create :name => "The perfect cherry pie!"
Article.create :name => "Foods to avoid when in a hurry!"
Category.create :name => "Kitchen"
Article.create :name => "The buyers guide to great refrigeration units."
Article.create :name => "The best stove for your money."
Category.create :name => "Beverages"
Article.create :name => "How to: Make your own soda."
Article.create :name => "How to: Fermenting fruit."
Ahora usted tiene algunas categorías y varios artículos. Sin embargo, no están categorizados usando etiquetas. Entonces, tendremos que hacer eso:
a = Tag.new
a.taggable = Article.find_by_name("Picking the right restaurant.")
a.category = Category.find_by_name("Food")
a.save
Luego puede repetir esto para cada uno, esto enlazará sus categorías y artículos. Después de hacer esto usted será capaz de acceder a las categorías de cada artículo y los artículos de cada Categoría del alojamiento:
Article.first.categories
Category.first.articles
Notas:
1) Cada vez que desee eliminar un elemento que está unida por un enlace de modelo asegúrese de usa "destruir". Cuando destruyes un objeto vinculado, también destruirá el enlace. Esto asegura que no hay enlaces malos o muertos. Es por eso que usamos ': dependent =>: destroy'
2) Al configurar nuestro modelo 'Artículo', que es uno de nuestros modelos 'etiquetables', se debe vincular usando: as. Como en el ejemplo anterior usamos 'taggable_type' y 'taggable_id' utilizamos: as =>: taggable. Esto ayuda a los rieles a saber cómo almacenar los valores en la base de datos.
3) Cuando la vinculación de categorías a los artículos, utilizamos: has_many: artículos,: a través de =>: etiquetas,: fuente =>: taggable,: source_type => 'Artículo' Esto le dice al modelo de la categoría que debería tener muchos: artículos a través de: etiquetas. La fuente es: etiquetable, por la misma razón que la anterior. El tipo de fuente es "Artículo" porque un modelo establecerá automáticamente taggable_type a su propio nombre.
Voy a tratar de probar esto un poco hoy para ver si entiendo completamente cómo hacerlo. – Serodis