Alan Oliveira
Joined
60 Experience
0 Lessons Completed
0 Questions Solved
Activity
Posted in When pre/eager loading an association, is there any way to get the associated data from a cache?
It seems not to be possible,
The best I could find is described below, but both are terrible.
Create a scope overriding preload_associations
to force the preloader get the data from the cache
def preload_associations(records)
ActiveRecord::Associations::Preloader.new(records: records, associations: :category, available_records: Category.all_from_my_awesome_cache).call
super
end
Override association
to manually load the record before it tries to fetch from db
def association(name)
super.tap do |assoc|
next if assoc.loaded? || assoc.reflection.class_name != "Category"
assoc.target = Category.all_from_my_awesome_cache.find { it.id == assoc.owner.category_id }
assoc.loaded!
end
end
After all, the best way is the simplest one, just override category
method on Book
class
Posted in When pre/eager loading an association, is there any way to get the associated data from a cache?
class Category < ActiveRecord::Base
# columns: name
has_many :books
end
class Book < ActiveRecord::Base
# columns: title, category_id
belongs_to :category
end
Given the above example, let's suppose Category
rarely changes and categories
table is quite small but it can't be an enum.
Is there any way to cache Category.all
and use it in all future Book.includes(:category)
?