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.

There was a problem

You must be a member of this account.

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 Association count with include doesn't alias join table 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 Count on has_many associations doesn't respect the association :limit and :of... 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 Count on has_many associations doesn't respect the association :limit and :of... 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