Forum: Ruby on Rails Many To Many Relationship help needed

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
A403b066546fb3672657cfadf5a81f5a?d=identicon&s=25 Mooktakim Ahmed (Guest)
on 2007-02-20 23:37
(Received via mailing list)
Hello,

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.
21f7ed21f11a809050594c82eab11d67?d=identicon&s=25 Robert Walker (Guest)
on 2007-02-20 23:51
(Received via mailing list)
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.
21f7ed21f11a809050594c82eab11d67?d=identicon&s=25 Robert Walker (Guest)
on 2007-02-20 23:54
(Received via mailing list)
Oops slight typo in previous post

articles.results.extract

should have been

article.results.extract
3299251223f55753ec84719de39e6e53?d=identicon&s=25 Jon Garvin (Guest)
on 2007-02-21 00:00
(Received via mailing list)
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 = ?", result.id])
end

This assumes that there's only ever one collection associated with any
article/result pair.
A403b066546fb3672657cfadf5a81f5a?d=identicon&s=25 Mooktakim Ahmed (Guest)
on 2007-02-21 00:27
(Received via mailing list)
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.

On Tue, February 20, 2007 10:58 pm, Jon Garvin wrote:
>

>
>> end
>>
>> How would i do this?
>>
>
>
> >
>
>


--
Website: http://www.mooktakim.com
email: mma@mooktakim.com
A403b066546fb3672657cfadf5a81f5a?d=identicon&s=25 Mooktakim Ahmed (Guest)
on 2007-02-21 00:30
(Received via mailing list)
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.

On Tue, February 20, 2007 10:53 pm, Robert Walker wrote:
>

> On Feb 20, 5:50 pm, "Robert Walker" <rwalker...@gmail.com> wrote:
>> results.
>>> class Result < ActiveRecord::Base has_many :collections has_many :articles, :through
>>> create_table :collections do |t| t.column :id, :integer t.column :result_id, :integer
>>
>
>


--
Website: http://www.mooktakim.com
email: mma@mooktakim.com
D7c511ce5025d37b8c6bd9134e0f2bd9?d=identicon&s=25 Thorsten (Guest)
on 2007-02-21 11:24
(Received via mailing list)
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 ;) )

#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
This topic is locked and can not be replied to.