HABTM relationship with an array
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开发者_C百科 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
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
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")
精彩评论