2

I am a beginner with Rails 3 programming and I have one problem with creating the right model.

Let's say there is an application to manage the bibliography of a book, that is manage the mapping for each chapter of the list of referenced articles. So for the article part I could have something like:

create_table :articles do |t|
  t.string :title
  t.text   :content
  ...

On the bibliography side I would like to have a model like

create_table :bibliographies do |t|
  t.string :chapter
  t.text   :ref
  ...

where ref is actually an array of references to articles, so it would be managed via serialize ActiveRecord method.

Ok, so now the issue is about how to make so that the elements of the array @bibliography.ref are references (in Ruby sense) to several article_id.

How do I model such a relationship, and what Rails 3 code should I write to express that? The thing that confuses me is that a single field of a single instance of @bibliography would reference to many @article.id .

Thanks in advance

bitwelder
  • 1,095
  • 8
  • 11
  • What's the point of serializing the foreign keys related ti the articles? Why don't you use the normal habtm way? I really don't understand, sorry – apneadiving Jan 05 '11 at 15:03

2 Answers2

4

If you really want to store relationships like that, then I would define a method in Bibliography model, something like this

(Assuming that ref is an array of ids)

def articles
  Article.where(:id => self.ref)
end

I would store the relationship differently though. Add a third table/model articles_bibliographies with article_id and bibliography_id fields. Then you can use the has_many :through association which is built into ActiveRecord.

in your Bibliography class you would then have something like:

has_many :articles_bibliographies
has_many :articles, :through => :articles_bibliographies

then you can just do @bibliography.articles

Read more here http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

egze
  • 3,200
  • 23
  • 23
  • Thanks, I did not exclude possibility to use has-many-through relationship, as far I can keep my array :) so I'll work on how to implement that. – bitwelder Jan 06 '11 at 14:03
0

Following egze's suggestion, I found a way to solve my problem (without using arrays!). So, I create a has_many-through relationship, but as I want to save the order for the articles how they are mentioned in the bibliography, the table articles_bibliographies has also a order_nr field, where I store which is the first, second, etc. article mentioned in the bibliography:

create_table :articles_bibliographies do |t|
   t.references  :article
   t.references  :bibliography
   t.integer     :order_nr

This way I can retrieve and show an ordered list of elements with:

@bibliography.articles.order("order_nr ASC")
bitwelder
  • 1,095
  • 8
  • 11