Active Record Join does not return catesian product

I’m trying to join two tables with active record and not getting what I expect *surprise*.

Two tables T1 and T2, both have a common key called ID. Given this relationship in the Models

class T1 < ActiveRecord::Base   has_one :T2

class T1 < ActiveRecord::Base   belongs_to :T1

In the controller I have…   @results = T1.all(:joins => :T2)   @results only contains the columns from T1 and none from T2.

If I do a find_by_sql as follows   @results = T1.find_by_sql("select * from T1, T2 where T1.id = T2.id")   @results contains the correct Cartesian product of T1, T2.

Am I missing something in the active record call?

Thanks in advance for your time... jeff...

Jeffrey H. wrote in post #975932:

I’m trying to join two tables with active record and not getting what I expect *surprise*.

Two tables T1 and T2, both have a common key called ID. Given this relationship in the Models

class T1 < ActiveRecord::Base   has_one :T2

class T1 < ActiveRecord::Base   belongs_to :T1

In the controller I have…   @results = T1.all(:joins => :T2)   @results only contains the columns from T1 and none from T2.

If I do a find_by_sql as follows   @results = T1.find_by_sql("select * from T1, T2 where T1.id = T2.id")   @results contains the correct Cartesian product of T1, T2.

Am I missing something in the active record call?

No; rather, you're missing something in the setup. Normally the foreign key for t2 would be t1.t2_id , not simply t1.id .

I think your DB design has problems, frankly. You shouldn't normally be trying to match the primary key in one table with the primary key in another. What are you trying to achieve here?

Thanks in advance for your time... jeff...

Best,

I’m trying to join two tables with active record and not getting what I expect *surprise*.

Two tables T1 and T2, both have a common key called ID. Given this relationship in the Models

class T1 < ActiveRecord::Base has_one :T2

class T1 < ActiveRecord::Base belongs_to :T1

In the controller I have… @results = T1.all(:joins => :T2) @results only contains the columns from T1 and none from T2.

The select clause defaults to t1.* If you want something else you have to ask for it

Fred