Relación hbtm con una matriz
-
25-09-2019 - |
Pregunta
Soy un principiante con la programación Rails 3 y tengo un problema con la creación del modelo correcto.
Digamos que hay una aplicación para administrar la bibliografía de un libro, es decir, administrar el mapeo para cada capítulo de la lista de artículos referenciados. Entonces, para la parte del artículo, podría tener algo como:
create_table :articles do |t|
t.string :title
t.text :content
...
En el lado de la bibliografía me gustaría tener un modelo como
create_table :bibliographies do |t|
t.string :chapter
t.text :ref
...
dónde ref
en realidad es una variedad de referencias a artículos, por lo que se gestionaría a través de serialize
Método Activerecord.
Ok, ahora el problema es sobre cómo hacer para que los elementos de la matriz @bibliography.ref
son referencias (en sentido rubí) a varios article_id
.
¿Cómo modelo tal relación y qué código Rails 3 debo escribir para expresar eso? Lo que me confunde es que un solo campo de una sola instancia de @Bibliography haría referencia a muchos @artículo.id.
Gracias por adelantado
Solución
Si realmente quieres almacenar relaciones como esa, definiría un método en el modelo de bibliografía, algo como esto
(Suponiendo que la referencia es una variedad de IDS)
def articles
Article.where(:id => self.ref)
end
Sin embargo, almacenaría la relación de manera diferente. Agregue una tercera tabla/modelo Artículos_Bibliografías con los campos Artículo_ID y Bibliografía_ID. Luego puede usar el Has_Many: a través de la asociación que está integrado en Activerecord.
En tu clase de bibliografía, entonces tendrías algo como:
has_many :articles_bibliographies
has_many :articles, :through => :articles_bibliographies
Entonces puedes hacer @bibliography.articles
Leer más aquí http://guides.rubyonrails.org/association_basics.html#the-has_many-through-sociation
Otros consejos
Después de la sugerencia de Egze, encontré una manera de resolver mi problema (¡sin usar matrices!). Entonces, creo una relación Has_Many-through, pero como quiero guardar el orden para los artículos cómo se mencionan en la bibliografía, la tabla artículos_bibliografías también tiene un campo orden_nr, donde guardo que es el primero, segundo, etc. Artículo mencionado en la bibliografía:
create_table :articles_bibliographies do |t|
t.references :article
t.references :bibliography
t.integer :order_nr
De esta manera puedo recuperar y mostrar una lista ordenada de elementos con:
@bibliography.articles.order("order_nr ASC")