This project is archived and is in readonly mode.

#548 ✓wontfix
Jon

has_many :through w/ condition returns invalid included records

Reported by Jon | July 5th, 2008 @ 07:07 AM | in 2.x

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)

Comments and changes to this ticket

Create your profile

Help contribute to this project by taking a few moments to create your personal profile. Create your profile »

<h2 style="font-size: 14px">Tickets have moved to Github</h2>

The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>

People watching this ticket

Pages