[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-settings":3,"blogpost-how-to-speed-up-your-rails-backend-server":72},{"footer":4,"contact_form":6,"chat_widget":11,"accolades":19,"seo_social":63},{"iso_notice":5},"Wolfpack Digital is an ISO 9001:2015, ISO 27001:2013 and ISO 14001:2015 certified company - © _YEAR_ Wolfpack Digital. All rights reserved.",{"budgets":7},[8,9,10],"Under $50.000","Between $50.000 - 200.000","Over $200.000",{"consent":12},{"greeting":13,"title":14,"body":15,"accept_label":16,"decline_label":17,"declined_message":18},"Awoo! I'm Wolfpack Digital's AI assistant. Ask me anything about our services, process, or team, and if you want a project estimate, I can point you to our AI Estimator.","Data Privacy","\u003Cp>Hi there! We would love to talk with you. Under the EU General Data Protection Regulation, we need your approval for our use of personal information (e.g. your name and email address) you may provide as we communicate:\u003C\u002Fp>\n\u003Col>\n  \u003Cli>We'll store your personal information so that we can pick up the conversation if we talk later.\u003C\u002Fli>\n  \u003Cli>We may send you emails to follow up on our discussion here.\u003C\u002Fli>\n  \u003Cli>We may send you emails about our upcoming services and promotions.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Is this okay with you?\u003C\u002Fp>","Yes, I Accept","No, Not Now","No problem. Come back if you change your mind.",{"winnersOfList":20,"awardsList":29,"inHouseAppImages":46,"certificationsList":50},[21,25],{"alt":22,"href":23,"image":24},"European Awards","https:\u002F\u002Fwww.theeuropeanawards.eu\u002Fpremiado\u002Fwolfpack-digital-awarded-in-the-app-development-category","\u002Fimages\u002Fabout-us\u002Fwinners\u002Feuropean.svg",{"alt":26,"href":27,"image":28},"Webby Awards","https:\u002F\u002Fwinners.webbyawards.com\u002F2024\u002Fwebsites-and-mobile-sites\u002Fresponsible-technology\u002Fresponsible-ai\u002F275408\u002Fequality-ai-fair-and-unbiased-algorithms-to-eliminate-discrimination-in-machine-learning-models","\u002Fimages\u002Fabout-us\u002Fwinners\u002Fwebby.svg",[30,34,38,42],{"alt":31,"href":32,"image":33},"Clutch 1000 List Reveals Top-Rated Business Service Providers of 2023","https:\u002F\u002Fclutch.co\u002Fpress-releases\u002Fclutch-1000-fall-2023","\u002Fimages\u002Fabout-us\u002Fawards\u002Fclutch.svg",{"alt":35,"href":36,"image":37},"Clutch Recognizes the 1000 Best B2B Service Providers in its Exclusive 2019 Clutch 1000 List","https:\u002F\u002Fclutch.co\u002Fpress-releases\u002Frecognizes-1000-best-b2b-service-providers-its-exclusive-2019-1000-list","\u002Fimages\u002Fabout-us\u002Fawards\u002Fglobal.svg",{"alt":39,"href":40,"image":41},"Mobile App Daily Award","","\u002Fimages\u002Fabout-us\u002Fawards\u002Fmobile-app-daily.svg",{"alt":43,"href":44,"image":45},"Manifest Award","https:\u002F\u002Fthemanifest.com\u002Fro\u002Fweb-development\u002Fcompanies","\u002Fimages\u002Fabout-us\u002Fawards\u002Fmanifest.svg",[47],{"alt":48,"href":40,"image":49},"Wolfpack Labs","\u002Fimages\u002Fhomepage\u002Fawards\u002Flabs.svg",[51,55,59],{"alt":52,"href":53,"image":54},"ISO 27001 Certification","https:\u002F\u002Fwww.qscert.com\u002Fcs\u002Fissued-certificates\u002F?certID=_7690LD367","\u002Fimages\u002Fabout-us\u002Fcertifications\u002Fiso-27001.svg",{"alt":56,"href":57,"image":58},"ISO 9001 Certification","https:\u002F\u002Fwww.qscert.com\u002Fcs\u002Fissued-certificates\u002F?certID=_7690LBDB0","\u002Fimages\u002Fabout-us\u002Fcertifications\u002Fiso-9001.svg",{"alt":60,"href":61,"image":62},"ISO 14001 Certification","https:\u002F\u002Fwww.qscert.com\u002Fma\u002Fissued-certificates\u002F?certID=_7690LZSGS","\u002Fimages\u002Fabout-us\u002Fcertifications\u002Fiso-14001.svg",{"default_og_image_urls":64,"default_og_image_alt":68,"og_site_name":68,"og_locale":69,"twitter_site":70,"page_type_defaults":71},[65],{"url":66,"style":67},"\u002Fimages\u002Fsocial_share_preview.jpg","og","Wolfpack Digital","en_US","@DigitalWolfpack",{},["Reactive",73],{"title":74,"body":75,"slug":76,"featured_image_urls":77,"meta_tags":102,"reading_time":110,"title_size":111,"tag_list":112,"formatted_published_at":115,"short_description":116,"categories":117,"alt_text":118,"published_at":119,"content_updated_at":118,"formatted_content_updated_at":118,"key_takeaways":120,"faqs":121,"updated_at":122,"canonical_override":118,"no_index":123,"canonical_url":124,"publishers":125},"How to speed up your Rails backend server","\u003Cp>\u003Cmeta charset=\"utf-8\">\u003C\u002Fp>\r\n\r\n\u003Cp>Many small things can slow your backend server; And while we would love to cover them all, that would be impossible in one single article. \u003C\u002Fp>\r\n\r\n\u003Cp>So, today we will focus on the most usual suspect: \u003Cstrong>the n+1 queries problem.\u003C\u002Fstrong>\u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Ch2>\u003Cstrong>What’s an n+1 query? \u003C\u002Fstrong>\u003C\u002Fh2>\r\n\r\n\u003Cp>Let’s start with the beginning, what’s an n+1 query and why is it an actual problem?\u003C\u002Fp>\r\n\r\n\u003Cp>The n+1 issue is a pretty common mistake that can slow down your queries pretty hard. The problem happens when your code executes N extra statements to fetch data that was available and could’ve been fetched through the first statement.\u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Cp>Obviously, this means that the larger the N, the slower your machine will get. \u003C\u002Fp>\r\n\r\n\u003Cp>To give you an example, when having a one-to-many relationship and we want to get all parent entries with the child field(s), ORMs and poorly designed queries will create one query to retrieve all the parent entries, and then for each entry a different query to retrieve child data. \u003C\u002Fp>\r\n\r\n\u003Cp>This issue will generate very many queries, which will increase latency time and slow down performance a lot. Besides that, they are hard to point to, as each individual query will run fast enough and won’t be detected by benchmarking tools. \u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Ch2>\u003Cstrong>How can we handle n+1 queries? \u003C\u002Fstrong>\u003C\u002Fh2>\r\n\r\n\u003Cp>Without considering a specific technology, ORM, or platform, the general idea to avoid this issue would be to use \u003Ccode>JOINS\u003C\u002Fcode>. \u003C\u002Fp>\r\n\r\n\u003Cp>Using \u003Ccode>JOINS\u003C\u002Fcode> will force the lazy-loaded object (child) to be fetched in the initial query, instead of needing a new query for each entry for that. \u003C\u002Fp>\r\n\r\n\u003Cp>Many frameworks already have libraries that can either detect n+1 queries or override ORM relationships to be lazy. \u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Ch2>\u003Cstrong>Problem statement \u003C\u002Fstrong>\u003C\u002Fh2>\r\n\r\n\u003Cp>For the next few paragraphs we are going to use a very simple example in Rails, that is prone to n+1 queries, but can also be easily handled. We created a \u003Ccode>Parent\u003C\u002Fcode> class and a \u003Ccode>Child\u003C\u002Fcode> class, the association between those 2 being pretty obvious: a one-to-many relationship. \u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode># models\u002Fparent.rb \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>class Parent &lt; ApplicationRecord \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>has_many :children \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>end \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode> \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode># models\u002Fchild.rb \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>class Child &lt; ApplicationRecord \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>belongs_to :parent \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>end \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode> \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Ch2>\u003Cstrong>The Rails way \u003C\u002Fstrong>\u003C\u002Fh2>\r\n\r\n\u003Cp>Just as mentioned above, \u003Ccode>JOINS\u003C\u002Fcode> is a good fix for avoiding n+1 queries. \u003C\u002Fp>\r\n\r\n\u003Cp>Fortunately, Rails and ActiveRecord have a great method for this: \u003Ccode>includes\u003C\u002Fcode>. The core functionality of this method is to eager-load the mentioned associations. So in our Rails serializers and controllers, it would be natural for us to do something like: \u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode># serializers\u002Fparent_serializer.rb \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>class ParentSerializer &lt; ActiveModel::Serializer \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>attributes :id, :string_field \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>has_many :children \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>end \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode> \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode># controllers\u002Fparents_controller.rb \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>def index \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>render json: Parent.all \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>end \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Cp>Our serializer’s goal is to also render the list of \u003Ccode>Children\u003C\u002Fcode> a \u003Ccode>Parent\u003C\u002Fcode> has. When doing this, because of how ActiveRecord works, a new query will be executed for each \u003Ccode>Parent\u003C\u002Fcode> to serialize the \u003Ccode>children\u003C\u002Fcode>. \u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Cp>For this example, our database was seeded with 21 \u003Ccode>Parent\u003C\u002Fcode> instances, and as we can see this logic will create a new query for each one of them. Imagine having 10k entries in the database \u003C\u002Fp>\r\n\r\n\u003Cp>\u003Cimg alt=\"How to speed up your Rails backend server\" src=\"https:\u002F\u002Fs3-eu-west-2.amazonaws.com\u002Fwolfpack-digital-attachments-production\u002Fckeditor_assets\u002Fpictures\u002F367\u002Fcontent_How_to_speed_up_your_Rails_backend_server.png\" style=\"width: 780px; height: 767px\">\u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Cp>The simplest fix of them all will be to add just a few more characters in our method:\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode># old: render json: Parent.all \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>render json: Parent.includes(:children).all \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode> \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>This code will now have the log output: \u003C\u002Fp>\r\n\r\n\u003Cp>\u003Cimg alt=\"How to speed up your Rails backend server\" src=\"https:\u002F\u002Fs3-eu-west-2.amazonaws.com\u002Fwolfpack-digital-attachments-production\u002Fckeditor_assets\u002Fpictures\u002F368\u002Fcontent_How_to_speed_up_your_Rails_backend_server_2.png\" style=\"width: 780px; height: 131px\">\u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Cp>Now, this is an obvious improvement. Just when watching the queries executed in the logs, we can see that we have only 1 instead of N (number of \u003Ccode>Parent\u003C\u002Fcode> entries) and the initial one to get all Parents. \u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Ch2>\u003Cstrong>How does \u003Cem>includes\u003C\u002Fem> work? \u003C\u002Fstrong>\u003C\u002Fh2>\r\n\r\n\u003Cp>The includes method works in 2 ways, depending on the query that will be executed. \u003C\u002Fp>\r\n\r\n\u003Cp>Most of the time it will use preload, but in certain cases, it can also use \u003Cem>eager_load. ActiveRecord\u003C\u002Fem> will automatically use preload unless the associations are also used in another clause (like where). \u003C\u002Fp>\r\n\r\n\u003Cp>The nice thing about includes is that you can use it to preload multiple relations, like \u003Ccode> \u003Cem>Parent.includes(:child1, :child2, :child3). \u003C\u002Fem>\u003C\u002Fcode>It can also load nested associations, using \u003Ccode>Parent.includes(child: :grandchild)\u003C\u002Fcode>, and even \u003Ccode>Parent.includes(child: [grandchild: :great_grandchild])\u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Ch2>\u003Cstrong>Other options \u003C\u002Fstrong>\u003C\u002Fh2>\r\n\r\n\u003Cp>There are 3 main methods that Rails and ActiveRecord provide for us when we are handling references: * includes * references * joins \u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Cp>We already mentioned \u003Ccode>includes\u003C\u002Fcode>, the wonder method that helps us avoid n+1 queries by preloading the associated models. It is mostly used when wanting to retrieve these models, like in the example above, where the parent serializer also includes the children. \u003C\u002Fp>\r\n\r\n\u003Cp>The references method is used together with includes, as it triggers the tables to be JOINed rather than loaded separately. The joins method is used when the associated table is needed in a where or order clause, but they don’t need to be preloaded as they won’t be rendered. \u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Ch2>\u003Cstrong>Catching n+1 queries \u003C\u002Fstrong>\u003C\u002Fh2>\r\n\r\n\u003Cp>I get it, we aren’t thinking about n+1 queries with each line of code written. And we shouldn’t.. we have third-party libraries for that. \u003C\u002Fp>\r\n\r\n\u003Cp>Obviously, we can also do an eye test: just like in the screenshots above, debugging a slow controller method to see how many queries are done might be a good start, they will usually be very obvious. \u003C\u002Fp>\r\n\r\n\u003Cp>For the rest of us that want an easy way to catch n+1 queries, many libraries can help with that. \u003C\u002Fp>\r\n\r\n\u003Cp>The one that I use the most is Bullet, which is also the most popular Rails option. \u003C\u002Fp>\r\n\r\n\u003Cp>The setup is very easy, as the basic setup only requires these few lines: \u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>config.after_initialize do \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>Bullet.enable = true \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>Bullet.bullet_logger = true \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>Bullet.raise = true # raise an error &amp; fail test if an n+1 query occurs end \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Cp>We want to add this only to the test environment, so we can find them when running the tests locally and in our CI workflow. \u003C\u002Fp>\r\n\r\n\u003Cp>Obviously, Bullet does allow many other options to be added, even whitelisting associations to avoid tests failing. \u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Ch2>\u003Cstrong>Does it matter? (benchmarks) \u003C\u002Fstrong>\u003C\u002Fh2>\r\n\r\n\u003Cp>There are many benchmarking resources on n+1 queries already available. \u003C\u002Fp>\r\n\r\n\u003Cp>For this article I will just try to locally benchmark a few queries, so we can see how much this issue can slow even when talking about just a few entries. \u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Ch3>\u003Cstrong>Examples &amp; benchmarking \u003C\u002Fstrong>\u003C\u002Fh3>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Cp>For these benchmarks, we will use the same example as above: a Parent and a Child models. \u003C\u002Fp>\r\n\r\n\u003Cp>The tests that I plan to do are having 20, 100 and 1000 Parent entries and compare only the implementation that doesn’t use any of the methods mentioned above (we will see the n+1 queries issue) and the one that uses includes.\u003C\u002Fp>\r\n\r\n\u003Cp>For each of the examples, I used FactoryBot and Faker like this: \u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>FactoryBot.create_list(:parent, number) \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode>FactoryBot.create_list(:child, number * 10, parent_id: Parent.all.pluck(:id).sample) \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>\u003Ccode> \u003C\u002Fcode>\u003C\u002Fp>\r\n\r\n\u003Cp>This way, we will have a random distribution of children to parents and we will be able to see if any n+1 queries are executed. \u003C\u002Fp>\r\n\r\n\u003Cp>In order to make sure that n+1 queries reflect a real situation and we will be able to see performance issues, the testing includes 10 times more children than parents. \u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n\r\n\u003Cp>20 Parents, 200 Children - ~4 times slower \u003C\u002Fp>\r\n\r\n\u003Cp>Without \u003Ccode>includes\u003C\u002Fcode> : 540ms \u003C\u002Fp>\r\n\r\n\u003Cp>With \u003Ccode>includes\u003C\u002Fcode> : 136ms \u003C\u002Fp>\r\n\r\n\u003Cp>100 Parents, 1000 Children - ~2 times slower \u003C\u002Fp>\r\n\r\n\u003Cp>Without \u003Ccode>includes\u003C\u002Fcode> : 716ms \u003C\u002Fp>\r\n\r\n\u003Cp>With \u003Ccode>includes\u003C\u002Fcode> : 339ms 1000 Parents, 10000 Children - ~2 times slower Without includes : 3.38s With includes : 1.85s\u003C\u002Fp>\r\n\r\n\u003Cp> \u003C\u002Fp>\r\n","how-to-speed-up-your-rails-backend-server",[78,81,84,87,90,93,96,99],{"style":79,"url":80},"640","https:\u002F\u002Fwolfpack-digital-attachments-staging.s3.eu-west-2.amazonaws.com\u002Fstore\u002Fblogpost\u002F104\u002Ffeatured_image\u002F640\u002Fimage_processing20220615-4-11zhqi9.webp",{"style":82,"url":83},"768","https:\u002F\u002Fwolfpack-digital-attachments-staging.s3.eu-west-2.amazonaws.com\u002Fstore\u002Fblogpost\u002F104\u002Ffeatured_image\u002F768\u002Fimage_processing20220615-4-11zhqi9.webp",{"style":85,"url":86},"1024","https:\u002F\u002Fwolfpack-digital-attachments-staging.s3.eu-west-2.amazonaws.com\u002Fstore\u002Fblogpost\u002F104\u002Ffeatured_image\u002F1024\u002Fimage_processing20220615-4-11zhqi9.webp",{"style":88,"url":89},"1366","https:\u002F\u002Fwolfpack-digital-attachments-staging.s3.eu-west-2.amazonaws.com\u002Fstore\u002Fblogpost\u002F104\u002Ffeatured_image\u002F1366\u002Fimage_processing20220615-4-11zhqi9.webp",{"style":91,"url":92},"1600","https:\u002F\u002Fwolfpack-digital-attachments-staging.s3.eu-west-2.amazonaws.com\u002Fstore\u002Fblogpost\u002F104\u002Ffeatured_image\u002F1600\u002Fimage_processing20220615-4-11zhqi9.webp",{"style":94,"url":95},"1920","https:\u002F\u002Fwolfpack-digital-attachments-staging.s3.eu-west-2.amazonaws.com\u002Fstore\u002Fblogpost\u002F104\u002Ffeatured_image\u002F1920\u002Fimage_processing20220615-4-11zhqi9.webp",{"style":97,"url":98},"thumb","https:\u002F\u002Fwolfpack-digital-attachments-staging.s3.eu-west-2.amazonaws.com\u002Fstore\u002Fblogpost\u002F104\u002Ffeatured_image\u002Fthumb\u002Fimage_processing20220615-4-11zhqi9.webp",{"style":100,"url":101},"original","https:\u002F\u002Fwolfpack-digital-attachments-staging.s3.eu-west-2.amazonaws.com\u002Fstore\u002Fblogpost\u002F104\u002Ffeatured_image\u002Foriginal\u002Fimage_processing20220615-4-11zhqi9.webp",{"title":103,"description":104,"keywords":105,"contact_form:title":106,"contact_form:cta":107,"og:site_name":68,"og:type":108,"og:locale":69,"twitter:card":109,"twitter:site":70,"twitter:creator":70,"og:title":74,"twitter:title":74},"How to speed up your Rails backend server | the n+1 queries problem","Here is how to speed up your Rails backend server considering the most usual suspect: the n+1 queries problem.","ruby on rails, ruby on rails website, How to speed up your Rails backend server, the n+1 queries problem, web development, web development ruby on rails, top ruby on rails development","contact us","send message","article","summary_large_image","5 min",32,[113,114],"web-development","ruby-on-rails","Jun 10, 2021","How to speed up your Rails backend server considering the most usual suspect: the n+1 queries problem.",[113],null,"2021-06-10T14:14:16.000Z",[],[],"2022-06-16T09:02:15.056Z",false,"https:\u002F\u002Fwd-fe-stage.herokuapp.com\u002Fblogposts\u002Fhow-to-speed-up-your-rails-backend-server",[126],{"id":127,"author":128,"short_description":118,"role":129,"avatar_urls":130,"cover_urls":118,"linkedin_link":118,"instagram_link":118,"x_link":118,"meta_tags":138,"last_published_at":140,"same_as":141},14,"Victor","Head of Web Development",[131,133,136],{"style":97,"url":132},"https:\u002F\u002Fwolfpack-digital-attachments-staging.s3.eu-west-2.amazonaws.com\u002Fstore\u002Fpublisher\u002F14\u002Favatar\u002Fthumb\u002FScreenshot_2021-06-10_at_17.webp",{"style":134,"url":135},"medium","https:\u002F\u002Fwolfpack-digital-attachments-staging.s3.eu-west-2.amazonaws.com\u002Fstore\u002Fpublisher\u002F14\u002Favatar\u002Fmedium\u002FScreenshot_2021-06-10_at_17.webp",{"style":100,"url":137},"https:\u002F\u002Fwolfpack-digital-attachments-staging.s3.eu-west-2.amazonaws.com\u002Fstore\u002Fpublisher\u002F14\u002Favatar\u002Foriginal\u002FScreenshot_2021-06-10_at_17.webp",{"title":40,"description":40,"keywords":40,"contact_form:title":106,"contact_form:cta":107,"og:site_name":68,"og:type":139,"og:locale":69,"twitter:card":109,"twitter:site":70,"twitter:creator":70},"website","2022-02-15T09:45:00.000Z",[]]