I like the idea of this plugin and would likely use it if it was available.
I'm not sure how I feel about littering `require_eager_loading` around my app, but since I don't have a better idea at this point I'm going to leave it at that :) On Thu, Oct 25, 2018 at 5:06 AM Janko Marohnić <[email protected]> wrote: > Hey everyone, > > In our application N+1 queries often creep in due to associations being > loaded dynamically. Since they keep coming back, I would like to take it > one step further and make Sequel raise an exception when an association was > requested but hasn't been eager loaded. > > I know about the tactical_eager_loading > <http://sequel.jeremyevans.net/rdoc-plugins/classes/Sequel/Plugins/TacticalEagerLoading.html> > plugin, but I want to always make it explicit which associations are being > loaded, I don't want it to be implicit. > > I was thinking that my "strict eager loading" plugin would behave like the > following: > > There would be a dataset method, e.g. `#require_eager_loading`, which you > can call before retrieving records. When that dataset loads model > instances, attempting to call association retrieval methods on those > instances will fail if the associations haven't been eager loaded (i.e. if > Sequel::Model#associations cache doesn't contain the corresponding loaded > association). The reasons for making this behaviour opt-in via a dataset > method, as opposed to having it be global activated, is so that (a) you can > gradually get your codebase rid of N+1s, and (b) you can still dynamically > load associations in tests, as having to eager load associations in tests > would probably add unnecessary verbosity. > > The model instances of associations eager loaded from a "strict eager > loading" enabled dataset should also be required to eager load *their* > associations. > In other words, the option that would be set by `#require_eager_loading` > should "spread" onto the model instances of associations as well. > > The way we would would slowly migrate to "strict eager loading" mode in > our app is that we would start making queries through our query objects (as > opposed to through Sequel::Model or Sequel::Database). These query objects > would then automatically add `#require_eager_loading` to each dataset. That > way retrieving data through Sequel::Model or Sequel::Database would still > allow dynamic loading of associations, but retrieving data through custom > query objects wouldn't. > > What do you think about this idea? I was thinking that we would first > write such a plugin internally in our app to try it out, and then I would > probably propose it to Sequel. I think it would be a great asset to Sequel > if it was able to disallow N+1 queries like that. > > Kind regards, > Janko > > -- > You received this message because you are subscribed to the Google Groups > "sequel-talk" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/sequel-talk. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "sequel-talk" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sequel-talk. For more options, visit https://groups.google.com/d/optout.
