Relacionamento HABTM com uma matriz
-
25-09-2019 - |
Pergunta
Sou iniciante com programação do Rails 3 e tenho um problema em criar o modelo certo.
Digamos que exista um aplicativo para gerenciar a bibliografia de um livro, que gere o mapeamento de cada capítulo da lista de artigos referenciados. Então, para a parte do artigo, eu poderia ter algo como:
create_table :articles do |t|
t.string :title
t.text :content
...
No lado da bibliografia, eu gostaria de ter um modelo como
create_table :bibliographies do |t|
t.string :chapter
t.text :ref
...
Onde ref
é na verdade uma variedade de referências a artigos, por isso seria gerenciado via serialize
Método ActiveRecord.
Ok, então agora a questão é sobre como fazer para que os elementos da matriz @bibliography.ref
são referências (no sentido de rubi) a vários article_id
.
Como faço para modelar esse relacionamento e qual código do Rails 3 devo escrever para expressar isso? O que me confunde é que um único campo de uma única instância de @bibliography referenciaria a muitos @artigo.id.
desde já, obrigado
Solução
Se você realmente deseja armazenar relacionamentos assim, eu definiria um método no modelo de bibliografia, algo assim
(Assumindo que o REF é uma variedade de IDs)
def articles
Article.where(:id => self.ref)
end
Eu armazenaria o relacionamento de maneira diferente. Adicione uma terceira tabela/modelo artigos_bibliografias com Artigo_ID e Bibliography_ID Fields. Então você pode usar o Has_Many: através da associação que está incorporada ao ActiveRecord.
Na sua aula de bibliografia, você teria algo como:
has_many :articles_bibliographies
has_many :articles, :through => :articles_bibliographies
então você pode simplesmente fazer @bibliography.articles
Leia mais aqui http://guides.rubyonrails.org/association_basics.html#the-has_many-through-sociation
Outras dicas
Após a sugestão de Egze, encontrei uma maneira de resolver meu problema (sem usar matrizes!). Então, eu crio um relacionamento Has_Many-Through, mas, como quero salvar o pedido para os artigos como eles são mencionados na bibliografia, a tabela Articles_bibliographies também possui um campo Order_NR, onde eu armazeno o primeiro, segundo etc. Artigo mencionado na bibliografia:
create_table :articles_bibliographies do |t|
t.references :article
t.references :bibliography
t.integer :order_nr
Dessa forma, posso recuperar e mostrar uma lista ordenada de elementos com:
@bibliography.articles.order("order_nr ASC")