{"id":48292,"date":"2013-03-25T12:36:45","date_gmt":"2013-03-25T09:36:45","guid":{"rendered":"https:\/\/www.altoros.com\/blog\/?p=48292"},"modified":"2020-10-22T14:55:51","modified_gmt":"2020-10-22T11:55:51","slug":"spidermans-extenstion-methods","status":"publish","type":"post","link":"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/","title":{"rendered":"Spiderman&#8217;s Extension Methods"},"content":{"rendered":"<p>Spiderman is on duty every day (except Sunday, maybe). The thing is that he finds time to develop Ruby-on-Rails applications. So, I have a friend of a friend with a friend knowing some random person who asked Spiderman about his favourite core extension methods. The first thing Spiderman told: \u2018Dude, call them Hardcore extension methods.\u2019<\/p>\n<p>So, let us see the list of coolest Hardcore extension methods.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-transparent ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#extract_options_Array\" >extract_options!(), Array<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#tryargs_block_Object\" >try(*args, &amp;block), Object<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#delegatemethods_Class\" >delegate(*methods), Class<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#sumidentity_0_block_Enumerable\" >sum(identity = 0, &amp;block), Enumerable<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#diffanother_hash_Hash\" >diff(another_hash), Hash<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#exceptkeys_Hash\" >except(*keys), Hash<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#Further_reading\" >Further reading<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"extract_options_Array\"><\/span><code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">extract_options!(), Array<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The <a href=\"https:\/\/apidock.com\/rails\/Array\/extract_options!\" rel=\"noopener noreferrer\" target=\"_blank\">extract_options!(), Array<\/a> method removes the last element of an array if it\u2019s a hash, and returns it. If there\u2019s no such element, it will return an empty hash.<\/p>\n<figure class=\"highlight\">\n<pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"k\">def<\/span> <span class=\"nf\">spin_the_web<\/span><span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">args<\/span><span class=\"p\">)<\/span>\r\n  <span class=\"n\">args<\/span><span class=\"p\">.<\/span><span class=\"nf\">extract_options!<\/span>\r\n<span class=\"k\">end<\/span>\r\n\r\n<span class=\"n\">spin_the_web<\/span><span class=\"p\">(<\/span><span class=\"ss\">:all_around<\/span><span class=\"p\">)<\/span>   <span class=\"c1\"># =&gt; {}<\/span>\r\n<span class=\"n\">spin_the_web<\/span><span class=\"p\">(<\/span><span class=\"ss\">:all_around<\/span><span class=\"p\">,<\/span> <span class=\"ss\">stickiness: <\/span><span class=\"o\">=&gt;<\/span> <span class=\"ss\">:average<\/span><span class=\"p\">)<\/span>  <span class=\"c1\"># =&gt; {:stickiness=&gt;:average}<\/span><\/code><\/pre>\n<\/figure>\n<p>It can be used, for example, in methods with a variable number of arguments and in its declaration, so you can easily separate an array of parameters and options hash.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"tryargs_block_Object\"><\/span><code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">try(*args, &amp;block), Object<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>So, you want to check if there\u2019s an instance variable and call a method on it. Without the <a href=\"https:\/\/apidock.com\/rails\/Object\/try\" rel=\"noopener noreferrer\" target=\"_blank\">try(*args, &amp;block), Object<\/a> method, it looks as shown below.<\/p>\n<figure class=\"highlight\">\n<pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"vi\">@random_dude<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"vi\">@random_dude<\/span><span class=\"p\">.<\/span><span class=\"nf\">spiderman?<\/span><\/code><\/pre>\n<\/figure>\n<p>That code is long enough and occurs too often, so there\u2019s a shortcut presented below.<\/p>\n<figure class=\"highlight\">\n<pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"vi\">@random_dude<\/span><span class=\"p\">.<\/span><span class=\"nf\">try<\/span><span class=\"p\">(<\/span><span class=\"ss\">:spiderman?<\/span><span class=\"p\">)<\/span><\/code><\/pre>\n<\/figure>\n<p>It will fail with <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">NoMethodError<\/code> if there\u2019s no such method (unless receiver is nil). You can pass arguments to the method after its name (just like you do for the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">public_send<\/code> method.)<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"delegatemethods_Class\"><\/span><code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">delegate(*methods), Class<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Let\u2019s take a look at the <a href=\"https:\/\/apidock.com\/rails\/Module\/delegate\" rel=\"noopener noreferrer\" target=\"_blank\">delegate(*methods), Class<\/a> method, and let&#8217;s start with an example.<\/p>\n<figure class=\"highlight\">\n<pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"k\">class<\/span> <span class=\"nc\">MaryJane<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">cook_soup<\/span>\r\n    <span class=\"s1\">'Mary is cooking'<\/span>\r\n  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span>\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">Spiderman<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"nf\">initialize<\/span>\r\n    <span class=\"vi\">@mary_jane<\/span> <span class=\"o\">=<\/span> <span class=\"no\">MaryJane<\/span><span class=\"p\">.<\/span><span class=\"nf\">new<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"n\">delegate<\/span> <span class=\"ss\">:cook_soup<\/span><span class=\"p\">,<\/span> <span class=\"ss\">to: :@mary_jane<\/span>\r\n<span class=\"k\">end<\/span>\r\n\r\n<span class=\"n\">spiderman<\/span> <span class=\"o\">=<\/span> <span class=\"no\">Spiderman<\/span><span class=\"p\">.<\/span><span class=\"nf\">new<\/span>\r\n<span class=\"n\">spiderman<\/span><span class=\"p\">.<\/span><span class=\"nf\">cook_soup<\/span>   <span class=\"c1\"># =&gt; \"Mary is cooking\"<\/span><\/code><\/pre>\n<\/figure>\n<p>Well, the example is very straightforward. You can delegate several methods in a single call. The delegation target can be pretty much everything: an instance variable, a class variable, a constant, or a method. There\u2019s no need to be charming like a Spiderman to use this method.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"sumidentity_0_block_Enumerable\"><\/span><code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">sum(identity = 0, &amp;block), Enumerable<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>After a hard day, Spiderman needs to calculate the total price of things he \u2018expropriated.\u2019 He can do this with the <a href=\"https:\/\/apidock.com\/rails\/Enumerable\/sum\" rel=\"noopener noreferrer\" target=\"_blank\">sum(identity = 0, &amp;block), Enumerable<\/a> method (if he has a PC nearby, of course).<\/p>\n<figure class=\"highlight\">\n<pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">].<\/span><span class=\"nf\">sum<\/span>   <span class=\"c1\"># =&gt; 15<\/span><\/code><\/pre>\n<\/figure>\n<p>You can also call it with a block (for example, to calculate sum for some attribute).<\/p>\n<figure class=\"highlight\">\n<pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"vi\">@goods_from_the_orphanage<\/span><span class=\"p\">.<\/span><span class=\"nf\">sum<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"ss\">:price<\/span><span class=\"p\">)<\/span>   <span class=\"c1\"># =&gt; 2000<\/span><\/code><\/pre>\n<\/figure>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"diffanother_hash_Hash\"><\/span><code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">diff(another_hash), Hash<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>You can easily determine difference between superheroes and villains by using the <a href=\"https:\/\/apidock.com\/rails\/Hash\/diff\" rel=\"noopener noreferrer\" target=\"_blank\">diff(another_hash), Hash<\/a> method.<\/p>\n<figure class=\"highlight\">\n<pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"n\">spiderman<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"ss\">racist: <\/span><span class=\"kp\">true<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"ss\">narcissistic: <\/span><span class=\"kp\">true<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"ss\">robs_the_banks: <\/span><span class=\"kp\">true<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"ss\">obsessed_with_his_uniqueness: <\/span><span class=\"kp\">true<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"ss\">wears_glasses: <\/span><span class=\"kp\">false<\/span> <span class=\"p\">}<\/span>\r\n\r\n<span class=\"n\">dr_octopus<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"ss\">racist: <\/span><span class=\"kp\">true<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"ss\">narcissistic: <\/span><span class=\"kp\">true<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"ss\">robs_the_banks: <\/span><span class=\"kp\">true<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"ss\">obsessed_with_his_uniqueness: <\/span><span class=\"kp\">true<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"ss\">wears_glasses: <\/span><span class=\"kp\">true<\/span> <span class=\"p\">}<\/span>\r\n\r\n<span class=\"n\">spiderman<\/span><span class=\"p\">.<\/span><span class=\"nf\">diff<\/span><span class=\"p\">(<\/span><span class=\"n\">dr_octopus<\/span><span class=\"p\">)<\/span>   <span class=\"c1\"># =&gt; {:wears_glasses=&gt;false}<\/span><\/code><\/pre>\n<\/figure>\n<p>As you can see, there\u2019s much difference here. So, duplicated key-value pairs do not belong to the result. If there are different values and the same key, the value from the receiver goes to the result. The rest is just merged.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"exceptkeys_Hash\"><\/span><code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">except(*keys), Hash<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>To get a part of some hash, use the <a href=\"https:\/\/apidock.com\/rails\/Hash\/except\" rel=\"noopener noreferrer\" target=\"_blank\">except(*keys), Hash<\/a> method.<\/p>\n<figure class=\"highlight\">\n<pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"n\">spiderman<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"ss\">superpowers: <\/span><span class=\"kp\">true<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"ss\">latex_costume: <\/span><span class=\"kp\">true<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"ss\">camera: <\/span><span class=\"kp\">true<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"n\">peter_parker<\/span> <span class=\"o\">=<\/span> <span class=\"n\">spiderman<\/span><span class=\"p\">.<\/span><span class=\"nf\">except<\/span><span class=\"p\">(<\/span><span class=\"ss\">:superpowers<\/span><span class=\"p\">,<\/span> <span class=\"ss\">:latex_costume<\/span><span class=\"p\">)<\/span>   <span class=\"c1\"># =&gt; {:camera=&gt;true}<\/span><\/code><\/pre>\n<\/figure>\n<p>That\u2019s the proof of Peter Parker being  photographed naked without superpowers. (Sorry, I can\u2019t post image with explicit content.)<\/p>\n<p>The original <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">except<\/code> method doesn\u2019t remove values from the receiver. However, it has a bang version which does.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Further_reading\"><\/span>Further reading<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/two-or-three-powerful-iterators\/\">Two Powerful Iterator Methods<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/\">Some Tricks on How to Optimize an Auto-Complete Combobox Using ZK and Java<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/lets-test-it-well-and-simply-and-smartly-2\/\">Let\u2019s Test It Well: Simply and Smartly<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>The one and only Spiderman&#8217;s cheat sheet about Active Support core extension methods<\/p>\n","protected":false},"author":42,"featured_media":58184,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":"","_links_to":"","_links_to_target":""},"categories":[214],"tags":[1000,895],"class_list":["post-48292","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-github","tag-research-and-development"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Spiderman&#039;s Extension Methods | Altoros<\/title>\n<meta name=\"description\" content=\"This is one and only Spiderman&#039;s cheat sheet about Active Support core extension methods.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spiderman&#039;s Extension Methods | Altoros\" \/>\n<meta property=\"og:description\" content=\"The one and only Spiderman&#039;s cheat sheet about Active Support core extension methods\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/\" \/>\n<meta property=\"og:site_name\" content=\"Altoros\" \/>\n<meta property=\"article:published_time\" content=\"2013-03-25T09:36:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-10-22T11:55:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2013\/03\/active-support-core-extension-methods.gif\" \/>\n\t<meta property=\"og:image:width\" content=\"898\" \/>\n\t<meta property=\"og:image:height\" content=\"342\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/gif\" \/>\n<meta name=\"author\" content=\"Alexander Sologub\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Alexander Sologub\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/\",\"name\":\"Spiderman's Extension Methods | Altoros\",\"isPartOf\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2013\/03\/active-support-core-extension-methods.gif\",\"datePublished\":\"2013-03-25T09:36:45+00:00\",\"dateModified\":\"2020-10-22T11:55:51+00:00\",\"author\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/926ba6b8608065bae61d79cfd7da9bce\"},\"description\":\"The one and only Spiderman's cheat sheet about Active Support core extension methods\",\"breadcrumb\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#primaryimage\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2013\/03\/active-support-core-extension-methods.gif\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2013\/03\/active-support-core-extension-methods.gif\",\"width\":898,\"height\":342},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.altoros.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spiderman&#8217;s Extension Methods\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\",\"url\":\"https:\/\/www.altoros.com\/blog\/\",\"name\":\"Altoros\",\"description\":\"Insight\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.altoros.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/926ba6b8608065bae61d79cfd7da9bce\",\"name\":\"Alexander Sologub\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/12\/Sologub_Aleksandr.jpg\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/12\/Sologub_Aleksandr.jpg\",\"caption\":\"Alexander Sologub\"},\"description\":\"Alexander Sologub has 6+ years in software engineering, being an expert in cloud automation and designing architectures for complex cloud-based systems. With strong background in Ruby, Go, and JavaScript, Alex took part in integrating a number of popular clouds with RightScale (a web-based platform for managing cloud infrastructures from multiple providers). His interests embrace building IoT solutions powered by cloud technologies and designing architectures that meet customer needs. Check out Alexander\u2019s profile on GitHub.\",\"url\":\"https:\/\/www.altoros.com\/blog\/author\/alexander-sologub\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spiderman's Extension Methods | Altoros","description":"This is one and only Spiderman's cheat sheet about Active Support core extension methods.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/","og_locale":"en_US","og_type":"article","og_title":"Spiderman's Extension Methods | Altoros","og_description":"The one and only Spiderman's cheat sheet about Active Support core extension methods","og_url":"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/","og_site_name":"Altoros","article_published_time":"2013-03-25T09:36:45+00:00","article_modified_time":"2020-10-22T11:55:51+00:00","og_image":[{"width":898,"height":342,"url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2013\/03\/active-support-core-extension-methods.gif","type":"image\/gif"}],"author":"Alexander Sologub","twitter_misc":{"Written by":"Alexander Sologub","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/","url":"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/","name":"Spiderman's Extension Methods | Altoros","isPartOf":{"@id":"https:\/\/www.altoros.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#primaryimage"},"image":{"@id":"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#primaryimage"},"thumbnailUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2013\/03\/active-support-core-extension-methods.gif","datePublished":"2013-03-25T09:36:45+00:00","dateModified":"2020-10-22T11:55:51+00:00","author":{"@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/926ba6b8608065bae61d79cfd7da9bce"},"description":"The one and only Spiderman's cheat sheet about Active Support core extension methods","breadcrumb":{"@id":"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#primaryimage","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2013\/03\/active-support-core-extension-methods.gif","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2013\/03\/active-support-core-extension-methods.gif","width":898,"height":342},{"@type":"BreadcrumbList","@id":"https:\/\/www.altoros.com\/blog\/spidermans-extenstion-methods\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.altoros.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Spiderman&#8217;s Extension Methods"}]},{"@type":"WebSite","@id":"https:\/\/www.altoros.com\/blog\/#website","url":"https:\/\/www.altoros.com\/blog\/","name":"Altoros","description":"Insight","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.altoros.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/926ba6b8608065bae61d79cfd7da9bce","name":"Alexander Sologub","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/12\/Sologub_Aleksandr.jpg","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/12\/Sologub_Aleksandr.jpg","caption":"Alexander Sologub"},"description":"Alexander Sologub has 6+ years in software engineering, being an expert in cloud automation and designing architectures for complex cloud-based systems. With strong background in Ruby, Go, and JavaScript, Alex took part in integrating a number of popular clouds with RightScale (a web-based platform for managing cloud infrastructures from multiple providers). His interests embrace building IoT solutions powered by cloud technologies and designing architectures that meet customer needs. Check out Alexander\u2019s profile on GitHub.","url":"https:\/\/www.altoros.com\/blog\/author\/alexander-sologub\/"}]}},"_links":{"self":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/48292","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/users\/42"}],"replies":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/comments?post=48292"}],"version-history":[{"count":13,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/48292\/revisions"}],"predecessor-version":[{"id":58185,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/48292\/revisions\/58185"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media\/58184"}],"wp:attachment":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media?parent=48292"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/categories?post=48292"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/tags?post=48292"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}