<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Krishnaswamy Subramanian]]></title>
  <link href="http://blog.krishnaswamy.in/atom.xml" rel="self"/>
  <link href="http://blog.krishnaswamy.in/"/>
  <updated>2013-04-14T10:28:03+05:30</updated>
  <id>http://blog.krishnaswamy.in/</id>
  <author>
    <name><![CDATA[Krishnaswamy Subramanian]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Ruby: Tap]]></title>
    <link href="http://blog.krishnaswamy.in/blog/2012/03/04/ruby-tap/"/>
    <updated>2012-03-04T23:30:00+05:30</updated>
    <id>http://blog.krishnaswamy.in/blog/2012/03/04/ruby-tap</id>
    <content type="html"><![CDATA[<p>When I first saw Ruby 1.9 new method Object#tap I slightly overlooked it and felt that this method may not be useful. But recently in one of my project I realized that how it can improve the reability of the code and avoids un-necessary return statements.</p>

<figure class='code'><figcaption><span>student.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">Student</span>
</span><span class='line'>  <span class="kp">attr_accessor</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:age</span><span class="p">,</span> <span class="ss">:std</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span> <span class="nb">name</span><span class="p">,</span> <span class="n">age</span><span class="p">,</span> <span class="n">std</span>
</span><span class='line'>      <span class="vi">@name</span><span class="p">,</span> <span class="vi">@age</span><span class="p">,</span> <span class="vi">@std</span> <span class="o">=</span> <span class="o">[</span><span class="nb">name</span><span class="p">,</span> <span class="n">age</span><span class="p">,</span> <span class="n">std</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">to_s</span>
</span><span class='line'>      <span class="s2">&quot;</span><span class="si">#{</span><span class="vi">@name</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="vi">@age</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="vi">@std</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we want to print and return the student object after creating it, without tap the code will look like:</p>

<figure class='code'><figcaption><span>without_tap.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">StudentFactory</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">create_student</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="n">age</span><span class="p">,</span> <span class="n">std</span><span class="p">)</span>
</span><span class='line'>      <span class="n">student</span> <span class="o">=</span> <span class="no">Student</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="n">age</span><span class="p">,</span> <span class="n">std</span><span class="p">)</span>
</span><span class='line'>      <span class="nb">p</span> <span class="n">student</span><span class="o">.</span><span class="n">to_s</span>
</span><span class='line'>      <span class="n">student</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The same can be made more readable and prettier with the help of tap</p>

<figure class='code'><figcaption><span>with_tap.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">StudentFactory</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">create_student</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="n">age</span><span class="p">,</span> <span class="n">std</span><span class="p">)</span>
</span><span class='line'>      <span class="no">Student</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="n">age</span><span class="p">,</span> <span class="n">std</span><span class="p">)</span><span class="o">.</span><span class="n">tap</span> <span class="p">{</span> <span class="o">|</span><span class="n">student</span><span class="o">|</span> <span class="nb">p</span> <span class="n">student</span><span class="o">.</span><span class="n">to_s</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rails: Restricting many to many association in rails]]></title>
    <link href="http://blog.krishnaswamy.in/blog/2012/03/04/rails-restricting-many-to-many-association-in-rails/"/>
    <updated>2012-03-04T16:41:00+05:30</updated>
    <id>http://blog.krishnaswamy.in/blog/2012/03/04/rails-restricting-many-to-many-association-in-rails</id>
    <content type="html"><![CDATA[<p>Rails offers two different way to implement the many to many association, this post will guide you to choose the right association for your project need</p>

<figure class='code'><figcaption><span>has_and_belongs_to_many.rb  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">Post</span>
</span><span class='line'>  <span class="n">has_and_many_belongs_to_many</span> <span class="ss">:comments</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Comments</span>
</span><span class='line'>  <span class="n">has_and_many_belongs_to_many</span> <span class="ss">:posts</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>has_many_through.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">Post</span>
</span><span class='line'>  <span class="n">has_many</span> <span class="ss">:commentables</span>
</span><span class='line'>  <span class="n">has_many</span> <span class="ss">:comments</span><span class="p">,</span> <span class="ss">:through</span> <span class="o">=&gt;</span> <span class="ss">:commentables</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Comment</span>
</span><span class='line'>  <span class="n">has_many</span> <span class="ss">:commentables</span>
</span><span class='line'>  <span class="n">has_many</span> <span class="ss">:posts</span><span class="p">,</span> <span class="ss">:through</span> <span class="o">=&gt;</span> <span class="ss">:commentables</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Commentable</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:post</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:comment</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>In both approach, the intermediate table is going to hold the relation and also will yield the same result but when to choose what, still puzzled?</p>

<p>Pointers to choose has_and_belongs_to_many. If you choose not to:</p>

<ul>
<li>Access the model which holds the relationship</li>
<li>Have any validations for the association</li>
<li>Read the associaton through the relationship</li>
</ul>


<p>To make it more clear, lets try to restrict the number of comments for a post.
This as well can be implemented in many ways but we (atleast I initally went with this approach) naturally tend to add logic in Post class</p>

<figure class='code'><figcaption><span>post.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">Post</span>
</span><span class='line'>  <span class="n">has_many</span> <span class="ss">:commentables</span><span class="p">,</span>
</span><span class='line'>  <span class="n">has_many</span> <span class="ss">:comments</span><span class="p">,</span> <span class="ss">:through</span> <span class="o">=&gt;</span> <span class="ss">:commentables</span><span class="p">,</span> <span class="ss">:before_add</span> <span class="o">=&gt;</span> <span class="ss">:check_comment_limit</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">private</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">check_comment_limit</span><span class="p">(</span><span class="n">comment</span><span class="p">)</span>
</span><span class='line'>      <span class="c1">#If you want to stop comment getting added to post, you have to raise an error.</span>
</span><span class='line'>      <span class="k">raise</span> <span class="s1">&#39;Comment limit reached&#39;</span> <span class="k">if</span> <span class="nb">self</span><span class="o">.</span><span class="n">comments</span><span class="o">.</span><span class="n">count</span> <span class="o">=</span> <span class="mi">5</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Another approach to tackle this is to add validation logic to the Comment class</p>

<figure class='code'><figcaption><span>comment.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">Comment</span>
</span><span class='line'>  <span class="n">has_many</span> <span class="ss">:commentables</span><span class="p">,</span>
</span><span class='line'>  <span class="n">has_many</span> <span class="ss">:posts</span><span class="p">,</span> <span class="n">through</span> <span class="o">=&gt;</span> <span class="ss">:commentables</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:check_comment_limit</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">private</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">check_comment_limit</span>
</span><span class='line'>      <span class="n">comment_count</span> <span class="o">=</span> <span class="nb">self</span><span class="o">.</span><span class="n">posts</span><span class="o">.</span><span class="n">comment</span><span class="o">.</span><span class="n">count</span>
</span><span class='line'>      <span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="ss">:posts</span><span class="p">,</span> <span class="s1">&#39;Comment limit reached&#39;</span><span class="p">)</span> <span class="k">if</span> <span class="n">comment_count</span> <span class="o">=</span> <span class="mi">5</span>
</span><span class='line'>      <span class="c1">#If you want to stop comment getting added to post, you have to raise an error.</span>
</span><span class='line'>      <span class="k">raise</span> <span class="s1">&#39;Comment limit reached&#39;</span> <span class="k">if</span> <span class="n">comment_count</span> <span class="o">=</span> <span class="mi">5</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>In both the approaches we have to raise an exception to prevent the comment from getting added to the post. I felt these approaches are not the conventional way of doing things, I went back and read the <a href="http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many" title="rails guide on many to many association">rails guide on association</a> and rewrote the validation logic in the relation model which holds the association.</p>

<figure class='code'><figcaption><span>commentable.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">Commentable</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:post</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:comment</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:check_comment_limit</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">private</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">check_comment_limit</span>
</span><span class='line'>      <span class="n">comment_count</span> <span class="o">=</span> <span class="nb">self</span><span class="o">.</span><span class="n">posts</span><span class="o">.</span><span class="n">comment</span><span class="o">.</span><span class="n">count</span>
</span><span class='line'>      <span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="ss">:post</span><span class="p">,</span> <span class="s1">&#39;Comment limit reached&#39;</span><span class="p">)</span> <span class="k">if</span> <span class="n">comment_count</span> <span class="o">=</span> <span class="mi">5</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>We don&#8217;t have to raise the exception by ourself rails will handle it gracefully.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ruby: inject vs each with object]]></title>
    <link href="http://blog.krishnaswamy.in/blog/2012/02/04/ruby-inject-vs-each-with-object/"/>
    <updated>2012-02-04T14:21:00+05:30</updated>
    <id>http://blog.krishnaswamy.in/blog/2012/02/04/ruby-inject-vs-each-with-object</id>
    <content type="html"><![CDATA[<p>We all know that inject is very powerful when it comes to:</p>

<figure class='code'><figcaption><span>sum.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="o">[</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="o">].</span><span class="n">inject</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">sum</span><span class="p">,</span> <span class="n">n</span><span class="o">|</span> <span class="n">sum</span> <span class="o">+=</span> <span class="n">n</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Simillary we can use it create a hash from an array</p>

<figure class='code'><figcaption><span>transform.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="c1">#using inject</span>
</span><span class='line'><span class="o">[[</span><span class="ss">:tom</span><span class="p">,</span><span class="mi">25</span><span class="o">]</span><span class="p">,</span><span class="o">[</span><span class="ss">:jerry</span><span class="p">,</span><span class="mi">15</span><span class="o">]].</span><span class="n">inject</span><span class="p">({})</span> <span class="k">do</span> <span class="o">|</span><span class="n">result</span><span class="p">,</span> <span class="n">name_and_age</span><span class="o">|</span>
</span><span class='line'>  <span class="nb">name</span><span class="p">,</span> <span class="n">age</span> <span class="o">=</span> <span class="n">name_and_age</span>
</span><span class='line'>  <span class="n">result</span><span class="o">[</span><span class="nb">name</span><span class="o">]</span> <span class="o">=</span> <span class="n">age</span>
</span><span class='line'>  <span class="n">result</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="o">=&gt;</span> <span class="p">{</span><span class="ss">:tom</span><span class="o">=&gt;</span><span class="mi">25</span><span class="p">,</span> <span class="ss">:jerry</span><span class="o">=&gt;</span><span class="mi">15</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, closely look at line number 5 we are returning the result from the block and this is passed on the enumerator for processing the next object in the array.</p>

<p>We can avoid this extra return statement with the help of Enumerator.each_with_object</p>

<figure class='code'><figcaption><span>transform.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="c1">#using each_with_object</span>
</span><span class='line'><span class="o">[[</span><span class="ss">:tom</span><span class="p">,</span><span class="mi">25</span><span class="o">]</span><span class="p">,</span><span class="o">[</span><span class="ss">:jerry</span><span class="p">,</span><span class="mi">15</span><span class="o">]].</span><span class="n">each_with_object</span><span class="p">({})</span> <span class="k">do</span> <span class="o">|</span><span class="n">name_and_age</span><span class="p">,</span> <span class="n">result</span><span class="o">|</span>
</span><span class='line'>  <span class="nb">name</span><span class="p">,</span> <span class="n">age</span> <span class="o">=</span> <span class="n">name_and_age</span>
</span><span class='line'>  <span class="n">result</span><span class="o">[</span><span class="nb">name</span><span class="o">]</span> <span class="o">=</span> <span class="n">age</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="o">=&gt;</span> <span class="p">{</span><span class="ss">:tom</span><span class="o">=&gt;</span><span class="mi">25</span><span class="p">,</span> <span class="ss">:jerry</span><span class="o">=&gt;</span><span class="mi">15</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Hello: Octopress]]></title>
    <link href="http://blog.krishnaswamy.in/blog/2011/12/01/hello-octopress/"/>
    <updated>2011-12-01T23:07:00+05:30</updated>
    <id>http://blog.krishnaswamy.in/blog/2011/12/01/hello-octopress</id>
    <content type="html"><![CDATA[<p>I am starting the blogging journey with a big thanks to <a href="http://brandonmathis.com" title="Brandon Mathis">Brandon Mathis</a> for his wonderfull blogging framework <a href="http://octopress.org" title="Octopress">Octopress</a> based on <a href="http://github.com/mojombo/jekyll" title="Jekyll">Jekyll</a></p>

<p>What I liked more about this blogging framework is the <a href="http://en.wikipedia.org/wiki/KISS_principle" title="Keep it simple stupid!">KISS</a> principle. I can stick to my favourite text editor vim, it won&#8217;t ask you unnecessary question on configuring the website. Everything will be up by few commands (Hmm&#8230; yes actually you might need some ruby based coding knowledge to start using this blogging framework). The framework is well documented as well</p>

<p>Well&#8230;. thats it for now, will write more on how did I configured and installed Octopress for my personal needs.</p>
]]></content>
  </entry>
  
</feed>
