Forum: Ruby on Rails AR Caching and Reflection

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.
John W. (Guest)
on 2006-05-23 23:51
When I do this:
  term = Term.find(1, :include => :definition)
  term.definition.term
Two SQL queries are fired, why?
Adam D. (Guest)
on 2006-05-24 00:49
(Received via mailing list)
can you show the 2 queries ?

and did you make sure you defined the has_X belongs_to relationship in
the
model ?
John W. (Guest)
on 2006-05-24 05:17
Adam D. wrote:
> can you show the 2 queries ?
>
> and did you make sure you defined the has_X belongs_to relationship in
> the
> model ?

class Term < ActiveRecord::Base
  has_one :definition, :dependent => :destroy
end

class Content < ActiveRecord::Base
end

class Definition < Content
  belongs_to :term
end

I run this:

term = Term.find(2, :include => :definition)
term.definition.term

Here are the SQL queries from the log (sorry for all the columns gumming
up the join):

Term Load Including Associations (0.032398)   SELECT terms.`id` AS
t0_r0, terms.`title` AS t0_r1, terms.`created_at` AS t0_r2,
terms.`updated_at` AS t0_r3, terms.`formatted_title` AS t0_r4,
terms.`definition_exists` AS t0_r5, contents.`id` AS t1_r0,
contents.`article_id` AS t1_r1, contents.`term_id` AS t1_r2,
contents.`parsed` AS t1_r3, contents.`type` AS t1_r4,
contents.`parsed_at` AS t1_r5, contents.`created_at` AS t1_r6,
contents.`updated_at` AS t1_r7, contents.`author_id` AS t1_r8 FROM terms
LEFT OUTER JOIN contents ON contents.term_id = terms.id AND
contents.`type` = 'Definition' WHERE (terms.id = 2)

  Term Load (0.000488)   SELECT * FROM terms WHERE (terms.id = 2) LIMIT
1
Adam D. (Guest)
on 2006-05-24 17:45
(Received via mailing list)
i think you are looping here.  Are you looking for the term based on a
definition or the definition based on a term ?

you shoudl only need to do "term.definition" and that should give you
the
definition for the term id=2.  Or does the definition table have an
actual
field called "term" ?  Maybe thats what screwing this up here.

adam
John W. (Guest)
on 2006-05-25 00:01
I'm sorry I was unclear.  I was only using term.definition.term as a
very basica example.  What I'm actually trying to achieve is this:
I grab a bunch of terms and include their definition.  I process all of
the terms I grabbed through various functions, some of which take a
definition.  In some of those definition handling functions the term is
used.  When those fire off they are in effect calling
term.definition.term
Rick O. (Guest)
on 2006-05-25 08:08
(Received via mailing list)
On 5/24/06, John W. <removed_email_address@domain.invalid> wrote:
> I'm sorry I was unclear.  I was only using term.definition.term as a
> very basica example.  What I'm actually trying to achieve is this:
> I grab a bunch of terms and include their definition.  I process all of
> the terms I grabbed through various functions, some of which take a
> definition.  In some of those definition handling functions the term is
> used.  When those fire off they are in effect calling
> term.definition.term

# Term Load Including Associations
term = Term.find(1, :include => :definition)

# Term Load
term.definition.term

Even though it's the same association, it's not loaded automatically.
One solution is to use cascading eager includes:

Term.find 1, :include => { :definition => :term }

But, I think this is very unnecessary in your case.  Why not do this?

defs = Definition.find :all, :include => :term ?

# need to query on the terms?
Definition.find :all, :include => :term, :conditions => ['terms.name =
?', 'foo']
Definition.find :all, :include => :term, :conditions => ['terms.id in
(?)', [1,2,3]]

# need to pull all the selected terms?
terms = defs.collect { |d| d.term }.uniq

It really helps to pull up the log and script/console so you can work
with your models and see when the database is queried.
This topic is locked and can not be replied to.