There is a class called Location . I would like to preload all direct children in one request.
In Location , the class relation is defined as follows:
has_many :children, class_name: self, finder_sql: ->(query) { self.class.where(%Q{"locations"."ancestry" like '%#{id}'}).to_sql }, counter_sql: ->(query) { self.class.where(%Q{"locations"."ancestry" like '%#{id}'}).count.to_sql } Location.first.children Location Load (0.4ms) SELECT "locations".* FROM "locations" LIMIT 1 Location Load (0.3ms) SELECT "locations".* FROM "locations" WHERE ("locations"."ancestry" like '%1') => [
But when I want to optimize this and download everything in just two batches:
Location.includes(:children).where(id: [5, 100]).all Location Load (0.4ms) SELECT "locations".* FROM "locations" WHERE "locations"."id" IN (5, 100) Location Load (0.2ms) SELECT "locations".* FROM "locations" WHERE "locations"."location_id" IN ('5') ActiveRecord::StatementInvalid: PG::Error: ERROR: column locations.location_id does not exist LINE 1: SELECT "locations".* FROM "locations" WHERE "locations"."lo... ^ : SELECT "locations".* FROM "locations" WHERE "locations"."location_id" IN ('5') from /xxx/.rvm/gems/ ruby-1.9.3-p194@gsp /gems/activerecord-3.2.8/lib/active_record/connection_adapters/postgresql_adapter.rb:1158:in `async_exec'
Is this a bug in Rails, or should I define it differently?
I am also trying to overwrite find_in_collection with respect, but this has no effect.
source share