Hi all, Welcome to another mystery solving.
This post will help you optimize your page loads in activeadmin.
If you don’t already know what activeadmin gem is, then refer here.
Problem:
While using activeadmin, I was facing performance issue on page loads. It was extremely slow. It was also resulting in memory overshooting.
If you are reading this post, then you probably encountered the above stated problem or maybe you just like to read and stay updated ;P
How did I debug the issue?
I started checking with network calls and db queries happening behind the scenes by looking at the logs (That’s why logging is very important).
On looking at the network call using browser console, I figured out somehow the page size that was getting loaded was significantly large [ For the stated observation, issue might have been something like loading of huge amount of data and since table was getting created and data was paginated, this could not have been the issue for memory overshooting in my case but this is worth a check. If your data is not paginated, then do that as your first solution ].
While checking all the queries the one thing that was already taken care was the problem on N+1 queries which can be solved by using includes for the associations.
If you look closely through the queries that were running, I came across a query which was returning the whole result set for the table with huge number of records. That being said, the issue was with the filter that was present on the list page which was actually trying to fit all those records into a dropdown (Page rendering can be a pain). [ Finally founded the root cause of the problem in my scenario ].
Solution:
Since, it was a gem (activeadmin) I was dealing with, the quick solution might be to use another gem to solve similar problem. Actually this problem was quite analogous to the one that I encountered when I was working with django-admin (built in ready to use admin application with django – python based web framework).
One of the solution was to not use the dropdown for loading associations, better to use a searchable ajax enabled select option. Fortunately, I founded a gem that was doing the exact same thing. The gem was activeadmin-searchable_select. It has pretty straight forward documentation that you can follow to meet your ends. This basically extends activeadmin features by certain extent by using select2 (searchable select) and provide some more modifications on form and filters.
I hope this post have been helpful in debugging your performance issue for activeadmin and also providing the solution.
See you all in next post. Au Revoir!