To preload the associated records we generally use #includes
, #preload
or #eager_load
for more information please see this blog
This will work perfectly if we preload associations for an ActiveRecord::Relation
, but in case if we want to load associated records for an Array, these methods will fail
Let's consider this example
class Company < ActiveRecord::Base
has_many :users
end
class User < ActiveRecord::Base
belongs_to :company
end
Say we have a query, which is performing joins and also have sub queries, then we would need to use find_by_sql
, to generate the query. But find_by_sql will result in array instead of ActiveRecord::Relation
If we try
@users = User.find_by_sql(some_condition).includes(:company)
will throw an error as includes
cannot work on an array
If we try calling includes first,
@users = User.includes(:company).find_by_sql(some_conditions)
The includes
part is silently dropped and only find_by_sql
part gets executed.
So we can let find_by_sql execute first
@users = User.find_by_sql(some_condition)
Then to load associated companies for each user we can use
ActiveRecord::Associations::Preloader.new(@users, :company).run
This will preload the company association for the @users object like it will do when we use includes.