Rails 5.2 cache key for relations generating two queries









up vote
1
down vote

favorite












I have a view using fragment caching for an ActiveRecord relation, e.g.



<% cache MyModel.all do %>
...
<% end %>


I see two DB queries generated in this case



  1. SELECT COUNT(*) AS "size", MAX("my_model"."updated_at") AS timestamp FROM "my_model"

  2. SELECT "my_model".* from "my_model"

I expect the first one, and it's usually a much more efficient query. I did not expect the second one.



If I instead use:



<% cache ActiveSupport::Cache.expand_cache_key(MyModel.all) do %>
...
<% end %>


then I get only the first query with the same resulting cache key.



Is it a bug or am I doing something wrong?



EDIT: narrowed down to where this happens: see https://github.com/rails/rails/pull/29092#issuecomment-437572543




when
normalize_version
is executed, the relation does not respond to cache_version, and
therefore ends up being expanded with
to_a.
So essentially, calling Product.all.to_a and then for each object
calling cache_version, which returns nil.











share|improve this question



























    up vote
    1
    down vote

    favorite












    I have a view using fragment caching for an ActiveRecord relation, e.g.



    <% cache MyModel.all do %>
    ...
    <% end %>


    I see two DB queries generated in this case



    1. SELECT COUNT(*) AS "size", MAX("my_model"."updated_at") AS timestamp FROM "my_model"

    2. SELECT "my_model".* from "my_model"

    I expect the first one, and it's usually a much more efficient query. I did not expect the second one.



    If I instead use:



    <% cache ActiveSupport::Cache.expand_cache_key(MyModel.all) do %>
    ...
    <% end %>


    then I get only the first query with the same resulting cache key.



    Is it a bug or am I doing something wrong?



    EDIT: narrowed down to where this happens: see https://github.com/rails/rails/pull/29092#issuecomment-437572543




    when
    normalize_version
    is executed, the relation does not respond to cache_version, and
    therefore ends up being expanded with
    to_a.
    So essentially, calling Product.all.to_a and then for each object
    calling cache_version, which returns nil.











    share|improve this question

























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      I have a view using fragment caching for an ActiveRecord relation, e.g.



      <% cache MyModel.all do %>
      ...
      <% end %>


      I see two DB queries generated in this case



      1. SELECT COUNT(*) AS "size", MAX("my_model"."updated_at") AS timestamp FROM "my_model"

      2. SELECT "my_model".* from "my_model"

      I expect the first one, and it's usually a much more efficient query. I did not expect the second one.



      If I instead use:



      <% cache ActiveSupport::Cache.expand_cache_key(MyModel.all) do %>
      ...
      <% end %>


      then I get only the first query with the same resulting cache key.



      Is it a bug or am I doing something wrong?



      EDIT: narrowed down to where this happens: see https://github.com/rails/rails/pull/29092#issuecomment-437572543




      when
      normalize_version
      is executed, the relation does not respond to cache_version, and
      therefore ends up being expanded with
      to_a.
      So essentially, calling Product.all.to_a and then for each object
      calling cache_version, which returns nil.











      share|improve this question















      I have a view using fragment caching for an ActiveRecord relation, e.g.



      <% cache MyModel.all do %>
      ...
      <% end %>


      I see two DB queries generated in this case



      1. SELECT COUNT(*) AS "size", MAX("my_model"."updated_at") AS timestamp FROM "my_model"

      2. SELECT "my_model".* from "my_model"

      I expect the first one, and it's usually a much more efficient query. I did not expect the second one.



      If I instead use:



      <% cache ActiveSupport::Cache.expand_cache_key(MyModel.all) do %>
      ...
      <% end %>


      then I get only the first query with the same resulting cache key.



      Is it a bug or am I doing something wrong?



      EDIT: narrowed down to where this happens: see https://github.com/rails/rails/pull/29092#issuecomment-437572543




      when
      normalize_version
      is executed, the relation does not respond to cache_version, and
      therefore ends up being expanded with
      to_a.
      So essentially, calling Product.all.to_a and then for each object
      calling cache_version, which returns nil.








      ruby-on-rails caching activerecord activesupport






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 2 days ago

























      asked Nov 9 at 8:59









      gingerlime

      2,99432456




      2,99432456



























          active

          oldest

          votes











          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "1"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













           

          draft saved


          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53222582%2frails-5-2-cache-key-for-relations-generating-two-queries%23new-answer', 'question_page');

          );

          Post as a guest



































          active

          oldest

          votes













          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes















           

          draft saved


          draft discarded















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53222582%2frails-5-2-cache-key-for-relations-generating-two-queries%23new-answer', 'question_page');

          );

          Post as a guest














































































          這個網誌中的熱門文章

          How to read a connectionString WITH PROVIDER in .NET Core?

          Node.js Script on GitHub Pages or Amazon S3

          Museum of Modern and Contemporary Art of Trento and Rovereto