Many To Many Relationship help needed


I have 3 models:

class Result < ActiveRecord::Base   has_many :collections   has_many :articles, :through => :collections end

class Article < ActiveRecord::Base   has_many :collections   has_many :results, :through => :collections end

class Collection < ActiveRecord::Base   belongs_to :result   belongs_to :article end

Collection has a table like this: create_table :collections do |t|       t.column :id, :integer       t.column :result_id, :integer       t.column :article_id, :integer       t.column :extract, :text end

The problem i have is this. I do a find for a single result. Then i go through each article in this result, using the each method.

At this point i'm outputting all the attributes of articles. But i want to also output the extract for this article and result.

How would i do this?

article.extract doesn't work, nor does article.results.extract

Thanks for your help.

In your design article has many collections therefor article also has many extracts. Which means that article will not have an extract method which is why article.extract will not work.

In the same way article.results method will give you an Array of Result object so obviously will not have an extract method. This is why articles.results.extract will not work.

Maybe that will help you rethink your design to produce your desired results.

Oops slight typo in previous post


should have been


You'll need to find the collection and use collection.extract. Easiest might be something like..

result.articles.each do |article|     collection = article.collections.find(:first, :conditions => ["result_id = ?",]) end

This assumes that there's only ever one collection associated with any article/result pair.

Mooktakim Ahmed wrote:

Thanks. But, won't this run SQL query for each article in result?

There must be an easy way to combine both article and result, using collection.

I'll use this for now, until i find something better.

I understand. I thought because i've combined both article and result using collection, the extract attribute might be included in both.

There must be a nice and simple way to do this, without going through every article, or result.

Anyway, thanks for your help.

use eager loading. That will only take one SQL query, and you will have all the stuff you need in your result. (code not tested and probably contains typos :wink: )

#controller @result = Result.find :first, :conditions => [someting], :include => {:collections => :articles }

#view <%= @result.collections.each do |coll| %> .... access the extract...   <%= coll.extract %>   ....access the article attributes with:....   <%= coll.article.some_attribute %> end