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.

Count on has_many associations doesn't respect the association :limit and :offset options

#348

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?

Reported by Bernardo Padua · June 5th, 2008 @ 11:11 PM

State: resolved
Milestone: 2.1.1
Assigned to: Jeremy Kemper Jeremy Kemper
Importance: Low

Activity

  1. Tarmo Tänav
    Tarmo Tänav
    • 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;

    June 28th, 2008 @ 03:09 PM

  2. Jeremy Kemper
    Jeremy Kemper
    • 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.

    July 16th, 2008 @ 07:23 AM

  3. Tarmo Tänav
    Tarmo Tänav

    Implemented as per Jeremy's suggestion, included the test in the patch as it didn't apply cleanly.

    August 26th, 2008 @ 05:30 PM

  4. Repository
    Repository
    • 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...

    August 28th, 2008 @ 07:33 AM

  5. Repository
    Repository

    (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...

    August 28th, 2008 @ 07:33 AM

  6. Ryan Bigg
    Ryan Bigg
    • Tag cleared.
    • Importance changed from to Low

    Automatic cleanup of spam.

    October 11th, 2010 @ 12:12 PM