Lighthouse has a new layout. Prefer the old one? Return to the old layout, and switch back any time from the link at the top of each page.

This project is archived and is in readonly mode.

has_many :through w/ condition returns invalid included records

#548

Given the following:

class Father < ActiveRecord::Base

has_many :children

has_many :boys, :through => :children, :conditions => 'boys.age < 10'

end

class Child < ActiveRecord::Base

belongs_to :boy

belongs_to :father

end

class Boy < ActiveRecord::Base

end

mysql> select * from fathers;

+------+

| id |

+------+

| 1 |

+------+

mysql> select * from boys;

+------+------+

| id | age |

+------+------+

| 1 | 5 |

| 2 | 18 |

+------+------+

mysql> select * from children;

+------+--------+-----------+

| id | boy_id | father_id |

+------+--------+-----------+

| 1 | 1 | 1 |

| 2 | 2 | 1 |

+------+--------+-----------+

Father.find(1).boys correctly returns Boy 1

Father.find(1, :include => :boys) incorrectly returns Boy 1 and Boy 2:

Gunner: ~/test [19] > script/console

Loading development environment (Rails 2.1.0)

>> f = Father.find 1

=> #

>> f.boys

=> [#]

>> f = Father.find 1, :include => :boys

=> #

>> f.boys

=> [#, #]

in the logs for the include, it's doing an additional call to get that incorrect Boy 2:

Father Load (0.000364) SELECT * FROM `fathers` WHERE (`fathers`.`id` = 1)

Child Load (0.000355) SELECT `children`.* FROM `children` WHERE (`children`.father_id IN (1))

Child Columns (0.010973) SHOW FIELDS FROM `children`

Boy Load (0.000381) SELECT * FROM `boys` WHERE (`boys`.id IN ('1','2') AND (boys.age < 10))

Boy Load (0.000317) SELECT * FROM `boys` WHERE (`boys`.`id` = 2)

Reported by Jon · July 5th, 2008 @ 07:07 AM

State: wontfix
Milestone: 2.x
Assigned to: nobody
Importance: none

Activity

  1. josh
    josh
    • State changed from new to wontfix

    October 5th, 2008 @ 03:17 PM