Leon de Rooij
2006-Jun-07 08:48 UTC
[Rails] has_many, through, want to store email in mysql
Hi,
I''m still a new with ROR, but it''s really cool :) I just have
this
problem with a project of mine.
I want to store email in a database. I already wrote a simple import
script, that works, so that''s not a problem. Showing the email
(efficiently) in a ROR site is.
These tables are in the database:
emails
id
email_id (foreign key -> emails.id)
seq
preamble
body
epilogue
headers
id
email_id (foreign key -> emails.id)
headerkeys_id (foreign key -> headerkeys.id)
seq
value
headerkeys
id
name
First, I thought I could use a HABTM (has and belongs to many), but
since the join table (headers) also contains extra information, like seq
and value, this shouldn''t be used, from what I read..
So, in ROR, I have these models defined:
email.rb:
class Email < ActiveRecord::Base
has_many :headers
has_many :headerkeys, :through => :headers
end
headerkey.rb:
class Headerkey < ActiveRecord::Base
has_many :emails
has_many :headers, :through => :headers
end
header.rb:
class Header < ActiveRecord::Base
belongs_to :email
belongs_to :headerkey
end
What I want to achieve, is to list all emails (a list like in every mail
client, with columns from, subject, date, etc), though a scaffold.
In the email_controller.rb, I have this:
def list
@email_pages, @emails = paginate :emails, :per_page => 10,
:conditions => ["email_id is NULL"]
end
And in the list view this (in short - only from colunn):
<% for email in @emails %>
<tr>
<td><%= email.headers.find(:first, :conditions =>
[''headerkey_id = ?'',
6]).value %></td>
</tr>
<% end %>
This means that for 30 emails, in the case of 3 columns (from, subject,
date), a total of 32 SELECTS have to be done.. That doesn''t look too
efficient :)
What would be the best way to do this ? Should I use a predefined JOIN
statement in the controller (with the paginate function) ? Or is it
possible to do this with the current controller and with some changes in
the view ?
Thanks in advance..
regards,
Leon
--
Posted via http://www.ruby-forum.com/.
Rodney Ramdas
2006-Jun-07 11:40 UTC
[Rails] has_many, through, want to store email in mysql
Hi Leon, sounds like a job for eager loading look in ActiveRecord#associations basically use :include to join in the associated columns hth On 6/6/06, Leon de Rooij <leon@toyos.nl> wrote:> Hi, > > I''m still a new with ROR, but it''s really cool :) I just have this > problem with a project of mine. > > I want to store email in a database. I already wrote a simple import > script, that works, so that''s not a problem. Showing the email > (efficiently) in a ROR site is. > > These tables are in the database: > > emails > id > email_id (foreign key -> emails.id) > seq > preamble > body > epilogue > > headers > id > email_id (foreign key -> emails.id) > headerkeys_id (foreign key -> headerkeys.id) > seq > value > > headerkeys > id > name > > First, I thought I could use a HABTM (has and belongs to many), but > since the join table (headers) also contains extra information, like seq > and value, this shouldn''t be used, from what I read.. > > So, in ROR, I have these models defined: > > email.rb: > class Email < ActiveRecord::Base > has_many :headers > has_many :headerkeys, :through => :headers > end > > headerkey.rb: > class Headerkey < ActiveRecord::Base > has_many :emails > has_many :headers, :through => :headers > end > > header.rb: > class Header < ActiveRecord::Base > belongs_to :email > belongs_to :headerkey > end > > What I want to achieve, is to list all emails (a list like in every mail > client, with columns from, subject, date, etc), though a scaffold. > > In the email_controller.rb, I have this: > > def list > @email_pages, @emails = paginate :emails, :per_page => 10, > :conditions => ["email_id is NULL"] > end > > And in the list view this (in short - only from colunn): > > <% for email in @emails %> > <tr> > <td><%= email.headers.find(:first, :conditions => [''headerkey_id = ?'', > 6]).value %></td> > </tr> > <% end %> > > This means that for 30 emails, in the case of 3 columns (from, subject, > date), a total of 32 SELECTS have to be done.. That doesn''t look too > efficient :) > > What would be the best way to do this ? Should I use a predefined JOIN > statement in the controller (with the paginate function) ? Or is it > possible to do this with the current controller and with some changes in > the view ? > > Thanks in advance.. > > regards, > > Leon > > > > > > > > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >-- Rodney http://www.pinupgeek.com http://www.dutchrailers.org