Navigation between DB Items with active Record

Hi,

I am having troubles to figure out how to move from one record to the
other without using <find_by_sql> or other ugly tricks. So far, I have
managed to do a lot of stuff without it but I decided that I need to
learn how it works this weekend! So I need your help to figure that
out…

I have the following 4 models:

class Client < ActiveRecord::Base
has_many :client_variations
has_many :variations, :through => :client_variations
end

class ClientVariation < ActiveRecord::Base
belongs_to :client
belongs_to :variation
end

class Variation < ActiveRecord::Base
belongs_to :concept
has_many :client_variations, :dependent => :destroy
end

class Concept < ActiveRecord::Base
has_many :variations, :order =>“id”, :dependent => :destroy
end

How can I get one of the Concept record associated with a specific
Client? So far I have this:

temp = clients(:air_canada).variations.concept.find(:all, limit => 1)

But I get this error:
NoMethodError: undefined method `concept’ for Variation:Class

Any help would be great because I am tired to hacking AR by using SQL
calls…

Thanks!

Alain Pilon wrote:

class Client < ActiveRecord::Base
belongs_to :concept
temp = clients(:air_canada).variations.concept.find(:all, limit => 1)

But I get this error:
NoMethodError: undefined method `concept’ for Variation:Class

Any help would be great because I am tired to hacking AR by using SQL
calls…

Thanks!

The above is failing (I think) because

clients(:air_canada).variations

has (or could have) more than one result and therefore returns an array
of Variation objects, and is equivalent to Variation.find(:all,
:conditions => [#some condition]).concept

Are you trying to get all concepts that belong to variations owned by
air_canada clients? If so, I’m wondering if include might help here.
Something (untested, but the console is your friend on these sorts of
things) like:

temp = clients(:air_canada).variations.find(:all, :include => :concept)

If you do this query in the console it’s dump the result on screen and
you should then be able to see how to extract the concepts.

HTH

Thanks Chris,

you were right, the problem was caused by an array. I figure it out last
night before going to bed and forgot it during the night until I saw
your post :wink: Thanks!

Since I was only interested in getting the first Variation, I put:

first_concept = clients(:air_canada).variations[0].concept

and do an assert_not_nil to make sure it exist.

Thanks again!

Alain Pilon wrote:

and do an assert_not_nil to make sure it exist.

Thanks again!

No prob. I had a similar thing earlier in the week where it became clear
after a good night’s sleep