This project is archived and is in readonly mode.
Count on has_many associations doesn't respect the association :limit and :offset options
Reported by Bernardo Padua | June 5th, 2008 @ 11:11 PM | in 2.1.1
If I have:
Class Post < AR:Base
has_many :comments, :limit=> 2
end
And run a count or size in the association, it won't respect the :limit (as well as :offset) options, like find will.
Say we have 3 comments:
post.comments.count # => 3
# Sql:
# SELECT count(*) AS count_all FROM "comments" WHERE
# ("comments".post_id = 271642539)
post.comments.length # => 2
# Sql:
# SELECT * AS count_all FROM "comments" WHERE
# ("comments".post_id = 271642539) LIMIT 2
To run the attached test that fails use:
rake test_sqlite3 TEST=test/cases/associations/has_many_associations_test.rb
Tested on Edge, 2.1, Sqlite3 and Postgres.
#302 by Ryan Bates describes another discrepancy of count vs. find. Maybe it's time for a refactoring count so it uses the same infrastructure to generate the queries as find?
Comments and changes to this ticket
-
Tarmo Tänav June 28th, 2008 @ 03:09 PM
- Tag set to activerecord, bug, edge, has_many, tested, tests
Do you have ideas on how calculations should be implemented with limit or offset? You can't just throw them at the end of the SQL because limit/offset in that case would apply to the result of the calculation, not the input of it that the option on has_many would imply.
One approach that I can think of is using a subquery, but it is not at all pretty and I'm not sure if all databases can support it:
SELECT COUNT(*) FROM (SELECT * FROM table LIMIT x OFFSET y) AS z;
-
Jeremy Kemper July 16th, 2008 @ 07:23 AM
- Milestone set to 2.1.1
- State changed from new to open
- Assigned user set to Jeremy Kemper
The count method could check for scoped :offset and :limit and do [[count_sql - offset, 0].max, limit].min instead of counting rows.
-
Tarmo Tänav August 26th, 2008 @ 05:30 PM
Implemented as per Jeremy's suggestion, included the test in the patch as it didn't apply cleanly.
-
Repository August 28th, 2008 @ 07:33 AM
- State changed from open to resolved
- Tag changed from activerecord, bug, edge, has_many, tested, tests to activerecord, bug, edge, has_many, patch, tested, tests
(from [367942d93bbb99aa2c2f8dc3900cb7c3f2ba4c65]) Implement count limit/offset support for has_many associations
[#348 state:resolved]
Signed-off-by: Jeremy Kemper jeremy@bitsweat.net http://github.com/rails/rails/co...
-
Repository August 28th, 2008 @ 07:33 AM
(from [96c6fe084228d570dad80e3100830edb2bc0448d]) Implement count limit/offset support for has_many associations
[#348 state:resolved]
Signed-off-by: Jeremy Kemper jeremy@bitsweat.net http://github.com/rails/rails/co...
-
Ryan Bigg October 11th, 2010 @ 12:12 PM
- Tag cleared.
- Importance changed from to Low
Automatic cleanup of spam.
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
Attachments
Referenced by
- 302 Association count with include doesn't alias join table IMO there are lots of discrepancies between count and fin...
- 348 Count on has_many associations doesn't respect the association :limit and :offset options [#348 state:resolved]
- 348 Count on has_many associations doesn't respect the association :limit and :offset options [#348 state:resolved]
- 831 count on HABTMs broken by Ruby 1.8.7 Array.count Added a test based on Mike's example above, and merged Ta...