This project is archived and is in readonly mode.
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
-
josh October 5th, 2008 @ 03:17 PM
- State changed from new to wontfix
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>