<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <title>has_many :bugs, :through =&gt; :rails - Home</title>
  <id>tag:m.onkey.org,2009:mephisto/</id>
  <generator version="0.7.3" uri="http://mephistoblog.com">Mephisto Noh-Varr</generator>
  
  <link href="http://m.onkey.org/" rel="alternate" type="text/html" />
  <updated>2009-10-18T18:47:54Z</updated>
  <link rel="self" href="http://feeds.feedburner.com/monkeyonrails" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-10-18:13249</id>
    <published>2009-10-18T18:47:00Z</published>
    <updated>2009-10-18T18:47:54Z</updated>
    <category term="railssummit" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/1ZcYwHcIq54/railssummit-slides" rel="alternate" type="text/html" />
    <title>Railssummit Slides</title>
<content type="html">
            &lt;p&gt;Here are the slides of my presentation at &lt;a href="http://www.railssummit.com.br/en"&gt;Railssummit 2009&lt;/a&gt;. Huge thanks to Locaweb and &lt;a href="http://www.akitaonrails.com"&gt;Fabio Akita&lt;/a&gt; for organizing the conference and having me there.&lt;/p&gt;


	&lt;p&gt;My talk was about Rails focused tips/tricks.&lt;/p&gt;


&lt;div&gt;&lt;a href="http://www.slideshare.net/pratiknaik/lessons-learnt-in-2009" title="Lessons Learnt in 2009"&gt;Lessons Learnt in 2009&lt;/a&gt;&amp;lt;object height="355" width="425"&gt;&amp;lt;param /&gt;&amp;lt;param /&gt;&amp;lt;param /&gt;&amp;lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=lessonslearnt-091018133732-phpapp02&amp;amp;#38;rel=0&amp;amp;#38;stripped_title=lessons-learnt-in-2009" height="355" width="425"&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;&lt;div&gt;View more &lt;a href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a href="http://www.slideshare.net/pratiknaik"&gt;pratiknaik&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;

	&lt;p&gt;Or you can download the pdf from &lt;a href="http://m.onkey.org/lessons_learnt_2009.pdf"&gt;here&lt;/a&gt;.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=1ZcYwHcIq54:lL3KqpJJf8I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=1ZcYwHcIq54:lL3KqpJJf8I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=1ZcYwHcIq54:lL3KqpJJf8I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=1ZcYwHcIq54:lL3KqpJJf8I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=1ZcYwHcIq54:lL3KqpJJf8I:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=1ZcYwHcIq54:lL3KqpJJf8I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/1ZcYwHcIq54" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/10/18/railssummit-slides</feedburner:origLink></entry>
  <entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-09-20:12317</id>
    <published>2009-09-20T17:36:00Z</published>
    <updated>2009-09-29T11:55:07Z</updated>
    <category term="shoulda" />
    <category term="test" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/k8rAl4tAABQ/make-your-shoulda-tests-faster-with-fast_context" rel="alternate" type="text/html" />
    <title>Make your shoulda tests faster with fast_context</title>
<content type="html">
            &lt;p&gt;I’ve been using Shoulda for a while. And for my current project, I decided to go fixtureless with Shoulda + Factory Girl. All good, except one problem. Slow as fuck tests. So here’s &lt;a href="http://github.com/lifo/fast_context"&gt;fast_context&lt;/a&gt; as a solution for it. fast_context compiles all the ‘should’s within a context into a single test.&lt;/p&gt;


	&lt;p&gt;For example :&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;UsersControllerTest&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActionController&lt;/span&gt;::&lt;span class="co"&gt;TestCase&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  fast_context &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;#new&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    setup &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="iv"&gt;@user&lt;/span&gt; = Factory(&lt;span class="sy"&gt;:user&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;      get &lt;span class="sy"&gt;:new&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    should_render_template &lt;span class="sy"&gt;:new&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    should_render_with_layout &lt;span class="sy"&gt;:users&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;This will be compiled into something like :&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;UsersControllerTest&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActionController&lt;/span&gt;::&lt;span class="co"&gt;TestCase&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  test &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;test: #new should run_fast&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="iv"&gt;@user&lt;/span&gt; = Factory(&lt;span class="sy"&gt;:user&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    get &lt;span class="sy"&gt;:new&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    should_render_template &lt;span class="sy"&gt;:new&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    should_render_with_layout &lt;span class="sy"&gt;:users&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;As your setup method just once per fast_context, the tests run much faster.&lt;/p&gt;


	&lt;p&gt;To install :&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;script/plugin install git&lt;span class="sy"&gt;:/&lt;/span&gt;/github.com/lifo/fast_context.git&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;This was a result of a short time of hacking. So there may be bugs. Please comment here if you run into any issues.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=k8rAl4tAABQ:cMvessBwrGA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=k8rAl4tAABQ:cMvessBwrGA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=k8rAl4tAABQ:cMvessBwrGA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=k8rAl4tAABQ:cMvessBwrGA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=k8rAl4tAABQ:cMvessBwrGA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=k8rAl4tAABQ:cMvessBwrGA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/k8rAl4tAABQ" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/9/20/make-your-shoulda-tests-faster-with-fast_context</feedburner:origLink></entry>
  <entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-08-07:11126</id>
    <published>2009-08-07T14:24:00Z</published>
    <updated>2009-08-07T14:24:21Z</updated>
    <category term="activerecord" />
    <category term="practise" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/YseJYKojV00/save-save" rel="alternate" type="text/html" />
    <title>save! &gt; save</title>
<content type="html">
            &lt;p&gt;Thoughtbot folks have a great article on not expecting exceptions – &lt;a href="http://giantrobots.thoughtbot.com/2007/9/26/active-record-programming-with-exceptions"&gt;save bang your head, active record will drive you mad&lt;/a&gt;. I’ll admit, just like the poster, I used to use &lt;em&gt;save!&lt;/em&gt; in controllers to &lt;em&gt;&lt;span class="caps"&gt;DRY&lt;/span&gt;&lt;/em&gt; my code. And have a global &lt;i&gt;rescue_from&lt;/i&gt; in &lt;em&gt;application.rb&lt;/em&gt;. But over the time, I changed the camp and now I’m fully in that &lt;i&gt;“Don’t expect expectations”&lt;/i&gt; camp. Some things are more important that &lt;em&gt;DRYing&lt;/em&gt; 3 lines of code.&lt;/p&gt;
&lt;p&gt;But I’d want to take this a step further. &lt;strong&gt;When you’re not expecting something to fail, always use the methods that raise exceptions on failure.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So I strongly disagree with the poster on this :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think ActiveRecord::Base#save! and ActiveRecord::Base.update_attributes! should be pulled from the public &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I would advocate just the opposite for certain cases. In many of the code reviews we’ve done via &lt;a href="http://actionrails.com/services.html"&gt;ActionRails&lt;/a&gt;, the following pattern was seen in many of the models :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;do_something&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="pc"&gt;self&lt;/span&gt;.foo = &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;bar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  save&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;create_items&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  names.each {|n| &lt;span class="pc"&gt;self&lt;/span&gt;.items.create &lt;span class="sy"&gt;:name&lt;/span&gt; =&amp;gt; n }&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;In the snippets above, it’s not checking for cases where the &lt;em&gt;save&lt;/em&gt; fails. And for good reasons that they’re not likely to fail as code is changing some very minor. But in these scenarios, a failure would be an unexpected situation. Hence you should always use &lt;em&gt;save!&lt;/em&gt; or &lt;em&gt;create!&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;There could be easily be any unexpected reasons the above &lt;em&gt;save&lt;/em&gt; could fail. And using &lt;em&gt;save!&lt;/em&gt; protects you from those situations and help catch those minor programming mistakes early, which otherwise could prove to be very costly in terms of time/efforts. So the above code should really be :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;do_something&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="pc"&gt;self&lt;/span&gt;.foo = &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;bar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  save!&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;create_items&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  names.each {|n| &lt;span class="pc"&gt;self&lt;/span&gt;.items.create! &lt;span class="sy"&gt;:name&lt;/span&gt; =&amp;gt; n }&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;However, if you’re using exceptions for flow control, this practise won’t always help you :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;create&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="iv"&gt;@user&lt;/span&gt; = &lt;span class="co"&gt;User&lt;/span&gt;.create! params[&lt;span class="sy"&gt;:user&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;  redirect_to &lt;span class="iv"&gt;@user&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;rescue&lt;/span&gt; &lt;span class="co"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="co"&gt;RecordNotSaved&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  flash[&lt;span class="sy"&gt;:notice&lt;/span&gt;] = &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Unable to create user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  render &lt;span class="sy"&gt;:new&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;As this catches the exception &lt;em&gt;ActiveRecord::RecordNotSaved&lt;/em&gt;, unexpected &lt;em&gt;save!&lt;/em&gt; failures from your model methods/callbacks will get caught too. And hide the real error.&lt;/p&gt;
&lt;p&gt;Moral of the story :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Don’t expect exceptions&lt;/li&gt;
	&lt;li&gt;Use methods throwing exceptions when you’re not expecting a failure. For example, everywhere you’re not checking if &lt;em&gt;save&lt;/em&gt; or &lt;em&gt;create&lt;/em&gt; fails when working with &lt;em&gt;Active Record&lt;/em&gt; objects, always use &lt;em&gt;save!&lt;/em&gt; and &lt;em&gt;create!&lt;/em&gt; instead.&lt;/li&gt;
&lt;/ul&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=YseJYKojV00:6tLNjKqo70U:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=YseJYKojV00:6tLNjKqo70U:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=YseJYKojV00:6tLNjKqo70U:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=YseJYKojV00:6tLNjKqo70U:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=YseJYKojV00:6tLNjKqo70U:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=YseJYKojV00:6tLNjKqo70U:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/YseJYKojV00" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/8/7/save-save</feedburner:origLink></entry>
  <entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-08-06:11116</id>
    <published>2009-08-06T12:16:00Z</published>
    <updated>2009-08-06T12:16:40Z</updated>
    <category term="activerecord" />
    <category term="performance" />
    <category term="rails" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/75-CzxJWRDA/use-index-with-active-record-finders" rel="alternate" type="text/html" />
    <title>USE INDEX with Active Record finders</title>
<content type="html">
            &lt;p&gt;MySQL doesn’t always pick the right index for your queries. Hence, sometimes you must tell it which index to use. Consider the example :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="co"&gt;Activity&lt;/span&gt;.all(&lt;span class="sy"&gt;:conditions&lt;/span&gt; =&amp;gt; [&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;created_at &amp;gt;= ? AND country_id = ?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="i"&gt;10&lt;/span&gt;.days.ago, &lt;span class="i"&gt;79&lt;/span&gt;])&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Running &lt;em&gt;&lt;span class="caps"&gt;EXPLAIN&lt;/span&gt;&lt;/em&gt; on the above query :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;EXPLAIN SELECT * FROM `activities` WHERE (created_at &gt;= '2009-07-27 12:58:44' AND country_id = 79);

Possible keys : index_activities_on_created_at,index_activities_on_created_at_and_country_id
Using the key : index_activities_on_created_at&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As you can see, even though the table has index on both the fields involved in the query – &lt;i&gt;index_activities_on_created_at_and_country_id&lt;/i&gt;, MySQL still uses &lt;i&gt;index_activities_on_created_at&lt;/i&gt;. You can explicitly ask MySQL to use the index you want by supplying &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/index-hints.html"&gt;&lt;span class="caps"&gt;USE&lt;/span&gt; &lt;span class="caps"&gt;INDEX&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;SELECT * FROM `activities` USE INDEX(index_activities_on_created_at_and_country_id) &lt;tt&gt;
&lt;/tt&gt;  WHERE (created_at &amp;gt;= '2009-07-27 12:58:44' AND country_id = 79);&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Active Record does not have any finder option to specify the index hint. Hence the solution is to exploit the &lt;em&gt;:from&lt;/em&gt; option :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;from = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;quoted_table_name&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; USE INDEX(index_activities_on_created_at_and_country_id)&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Activity&lt;/span&gt;.all(&lt;span class="sy"&gt;:from&lt;/span&gt; =&amp;gt; from, &lt;tt&gt;
&lt;/tt&gt;             &lt;span class="sy"&gt;:conditions&lt;/span&gt; =&amp;gt; [&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;created_at &amp;gt;= ? AND country_id = ?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="i"&gt;10&lt;/span&gt;.days.ago, &lt;span class="i"&gt;79&lt;/span&gt;])&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=75-CzxJWRDA:Hyq6t7CcKIA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=75-CzxJWRDA:Hyq6t7CcKIA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=75-CzxJWRDA:Hyq6t7CcKIA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=75-CzxJWRDA:Hyq6t7CcKIA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=75-CzxJWRDA:Hyq6t7CcKIA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=75-CzxJWRDA:Hyq6t7CcKIA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/75-CzxJWRDA" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/8/6/use-index-with-active-record-finders</feedburner:origLink></entry>
  <entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-08-05:11075</id>
    <published>2009-08-05T14:19:00Z</published>
    <updated>2009-08-05T14:20:04Z</updated>
    <category term="ruby" />
    <category term="tips" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/-ERFKx8d92E/ruby-i-don-t-like-3-object-freeze" rel="alternate" type="text/html" />
    <title>Ruby I don't like #3 - Object#freeze</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Object.html#M000356"&gt;Object#freeze&lt;/a&gt; annoys me. Not a lot, but enough to bitch blog about it. So, &lt;em&gt;freeze&lt;/em&gt; lets you make sure no one else modifies your precious little object :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&amp;gt;&amp;gt; a = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; a.freeze&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; a &amp;lt;&amp;lt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;wtf&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;TypeError&lt;/span&gt;: can&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;t modify frozen string&lt;tt&gt;
&lt;/tt&gt;  from (irb):23:in `&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  from (irb):&lt;span class="i"&gt;23&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;However, &lt;strong&gt;freeze does not protect the variable. It only protects the value.&lt;/strong&gt;&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&amp;gt;&amp;gt; a = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; a.freeze&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; a += &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;wtf&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;hellowtf&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;The weird behaviour is even more visible when you’re dealing with arrays :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&amp;gt;&amp;gt; x = [&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;freedom&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; x.freeze&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; x &amp;lt;&amp;lt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;world&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;TypeError&lt;/span&gt;: can&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;t modify frozen array&lt;tt&gt;
&lt;/tt&gt;  from (irb):6:in `&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  from (irb):&lt;span class="i"&gt;6&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; x[&lt;span class="i"&gt;0&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;wtf&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; x&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; [&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;hellowtf&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;freedom&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;]&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;It’s even weird with hashes :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&amp;gt;&amp;gt; a = {&lt;span class="sy"&gt;:x&lt;/span&gt; =&amp;gt; &lt;span class="i"&gt;1&lt;/span&gt;}&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; a.freeze&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; a[&lt;span class="sy"&gt;:x&lt;/span&gt;] = &lt;span class="i"&gt;2&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;TypeError&lt;/span&gt;: can&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;t modify frozen hash&lt;tt&gt;
&lt;/tt&gt;  from (irb):11:in `[]=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  from (irb):&lt;span class="i"&gt;11&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;However, above are not really the primary reasons I don’t like &lt;em&gt;freeze&lt;/em&gt;. It’s the fact that you cannot unfreeze an object without using something like &lt;a href="http://eigenclass.org/hiki/evil.rb+dl+and+unfreeze"&gt;evil.rb&lt;/a&gt;. And this goes against a lot of things Ruby stands for in my book. Ruby is never about defensive programming. Even where it tries to save you from yourself, there are always proper ways you can overcome the restriction. For example, &lt;em&gt;private&lt;/em&gt; methods and &lt;em&gt;send&lt;/em&gt;. If you want to restrict programmers, Ruby is not for you. Use Java/Python/whatever. Not Ruby. Ruby is not meant for preventing idiots from shooting their leg.&lt;/p&gt;
&lt;p&gt;Taking a real example :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;module&lt;/span&gt; &lt;span class="cl"&gt;ActiveSupport&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;module&lt;/span&gt; &lt;span class="cl"&gt;Testing&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;module&lt;/span&gt; &lt;span class="cl"&gt;Performance&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="co"&gt;DEFAULTS&lt;/span&gt; =&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;if&lt;/span&gt; benchmark = &lt;span class="pc"&gt;ARGV&lt;/span&gt;.include?(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;--benchmark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;)  &lt;span class="c"&gt;# HAX for rake test&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;          { &lt;span class="sy"&gt;:benchmark&lt;/span&gt; =&amp;gt; &lt;span class="pc"&gt;true&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;            &lt;span class="sy"&gt;:runs&lt;/span&gt; =&amp;gt; &lt;span class="i"&gt;4&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;            &lt;span class="sy"&gt;:metrics&lt;/span&gt; =&amp;gt; [&lt;span class="sy"&gt;:process_time&lt;/span&gt;, &lt;span class="sy"&gt;:memory&lt;/span&gt;, &lt;span class="sy"&gt;:objects&lt;/span&gt;, &lt;span class="sy"&gt;:gc_runs&lt;/span&gt;, &lt;span class="sy"&gt;:gc_time&lt;/span&gt;],&lt;tt&gt;
&lt;/tt&gt;            &lt;span class="sy"&gt;:output&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;tmp/performance&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt; }&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;else&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;          { &lt;span class="sy"&gt;:benchmark&lt;/span&gt; =&amp;gt; &lt;span class="pc"&gt;false&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;            &lt;span class="sy"&gt;:runs&lt;/span&gt; =&amp;gt; &lt;span class="i"&gt;1&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;            &lt;span class="sy"&gt;:min_percent&lt;/span&gt; =&amp;gt; &lt;span class="fl"&gt;0.01&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;            &lt;span class="sy"&gt;:metrics&lt;/span&gt; =&amp;gt; [&lt;span class="sy"&gt;:process_time&lt;/span&gt;, &lt;span class="sy"&gt;:memory&lt;/span&gt;, &lt;span class="sy"&gt;:objects&lt;/span&gt;],&lt;tt&gt;
&lt;/tt&gt;            &lt;span class="sy"&gt;:formats&lt;/span&gt; =&amp;gt; [&lt;span class="sy"&gt;:flat&lt;/span&gt;, &lt;span class="sy"&gt;:graph_html&lt;/span&gt;, &lt;span class="sy"&gt;:call_tree&lt;/span&gt;],&lt;tt&gt;
&lt;/tt&gt;            &lt;span class="sy"&gt;:output&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;tmp/performance&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt; }&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;end&lt;/span&gt;.freeze&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Here’s a code from Rails performance tests. As you can see, it defines a hash with config variables based on benchmark or profile mode. And then freezes the hash. Assuming you’re benchmarking, &lt;em&gt;&lt;span class="caps"&gt;DEFAULTS&lt;/span&gt;[:runs]&lt;/em&gt; determines how many times Rails should run the test in a loop :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="co"&gt;DEFAULTS&lt;/span&gt;[&lt;span class="sy"&gt;:runs&lt;/span&gt;].times { run_test_with_benchmarking &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;whatever test&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; }&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Now many times when I’m benchmarking and want to increase the number of times a test is ran, I just want to do something like :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;SpeedTest&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActionController&lt;/span&gt;::&lt;span class="co"&gt;PerformanceTest&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="co"&gt;DEFAULTS&lt;/span&gt;[&lt;span class="sy"&gt;:runs&lt;/span&gt;] = &lt;span class="i"&gt;1000&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;test_some_method&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="co"&gt;Model&lt;/span&gt;.some_method&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;However, that’s not possible thanks to the &lt;em&gt;freeze&lt;/em&gt;. I do know that changing &lt;em&gt;&lt;span class="caps"&gt;DEFAULTS&lt;/span&gt;[:runs]&lt;/em&gt; is not a public &lt;span class="caps"&gt;API&lt;/span&gt; yada yada yada. But it’s Ruby and I’ll change whatever the fuck I want to. I can understand certain cases where people use &lt;em&gt;freeze&lt;/em&gt; to prevent silly errors. That’s probably &lt;em&gt;OK&lt;/em&gt; to a certain extent. But remember, if you design your software for idiots, only idiots will use it.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=-ERFKx8d92E:o92rtvhoO_g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=-ERFKx8d92E:o92rtvhoO_g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=-ERFKx8d92E:o92rtvhoO_g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=-ERFKx8d92E:o92rtvhoO_g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=-ERFKx8d92E:o92rtvhoO_g:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=-ERFKx8d92E:o92rtvhoO_g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/-ERFKx8d92E" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/8/5/ruby-i-don-t-like-3-object-freeze</feedburner:origLink></entry>
  <entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-08-04:11021</id>
    <published>2009-08-04T17:28:00Z</published>
    <updated>2009-08-04T17:28:58Z</updated>
    <category term="ruby" />
    <category term="tips" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/cZlBK-GmiYA/ruby-i-don-t-like-2-catch-wtf-throw-wtf" rel="alternate" type="text/html" />
    <title>Ruby I don't like #2 - catch(:wtf) { throw :wtf }</title>
<content type="html">
            &lt;blockquote&gt;
&lt;p&gt;The 1960s and 1970s saw computer scientists move away from &lt;span class="caps"&gt;GOTO&lt;/span&gt; statements in favor of the structured programming programming paradigm. Some programming style coding standards prohibit use of &lt;span class="caps"&gt;GOTO&lt;/span&gt; statements. – &lt;a href="http://en.wikipedia.org/wiki/Goto#Criticism_of_goto_usage"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ruby takes the whole &lt;span class="caps"&gt;GOTO&lt;/span&gt; nonsense to an entirely new heights. Ruby’s version of &lt;span class="caps"&gt;GOTO&lt;/span&gt;/&lt;span class="caps"&gt;LABEL&lt;/span&gt; is called &lt;a href="http://www.ruby-doc.org/core/classes/Kernel.html#M005933"&gt;throw/catch&lt;/a&gt;. The lunacy goes further as Ruby’s &lt;em&gt;throw&lt;/em&gt; is equivalent to &lt;strong&gt;&lt;span class="caps"&gt;GOTO&lt;/span&gt; with a return value&lt;/strong&gt;.&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;hello&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  throw &lt;span class="sy"&gt;:done&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;wtf&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;catch(&lt;span class="sy"&gt;:done&lt;/span&gt;) { hello }&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;wtf&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Not only it makes the flow control hard to follow, it also shows your lack of fundamental programming skills. I’d love to see a case where you use throw/catch because there’s no other way. Only place I’ve &lt;strong&gt;ever&lt;/strong&gt; used throw/catch is in my evil middleware &lt;a href="http://m.onkey.org/2009/1/15/the-evil-calls-back"&gt;Rack::Evil&lt;/a&gt;. And the name says it all.&lt;/p&gt;
&lt;p&gt;Let’s take a real example from Rails :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;find_with_associations&lt;/span&gt;(options = {})&lt;tt&gt;
&lt;/tt&gt;  catch &lt;span class="sy"&gt;:invalid_query&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    join_dependency = &lt;span class="co"&gt;JoinDependency&lt;/span&gt;.new(&lt;span class="pc"&gt;self&lt;/span&gt;, merge_includes(scope(&lt;span class="sy"&gt;:find&lt;/span&gt;, &lt;span class="sy"&gt;:include&lt;/span&gt;), options[&lt;span class="sy"&gt;:include&lt;/span&gt;]), options[&lt;span class="sy"&gt;:joins&lt;/span&gt;])&lt;tt&gt;
&lt;/tt&gt;    rows = select_all_rows(options, join_dependency)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;return&lt;/span&gt; join_dependency.instantiate(rows)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  []&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Just by looking at this method, you’ll have absolutely no idea who’s gonna be throwing :invalid_query. It could be any method subsequently called while the block is being executed. Only way to know is by doing a global search for &lt;i&gt;throw :invalid_query&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Rails uses throw/catch here because it wants to return an empty array when something somewhere goes wrong. And the thing that can possibly go wrong is so deep down inside, throw/catch provides an easy way out without much refactoring. However, easy is not always the best way or the proper way.&lt;/p&gt;
&lt;p&gt;If we look at the relevant code from the involved methods :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;select_all_rows&lt;/span&gt;(options, join_dependency)&lt;tt&gt;
&lt;/tt&gt;  connection.select_all(&lt;tt&gt;
&lt;/tt&gt;    construct_finder_sql_with_included_associations(options, join_dependency),&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;name&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; Load Including Associations&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  )&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;construct_finder_sql_with_included_associations&lt;/span&gt;(options, join_dependency)&lt;tt&gt;
&lt;/tt&gt;  scope = scope(&lt;span class="sy"&gt;:find&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  sql = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;SELECT &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;column_aliases(join_dependency)&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; FROM &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;(scope &amp;amp;&amp;amp; scope[&lt;span class="sy"&gt;:from&lt;/span&gt;]) || options[&lt;span class="sy"&gt;:from&lt;/span&gt;] || quoted_table_name&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; &lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  ....&lt;tt&gt;
&lt;/tt&gt;  if !using_limitable_reflections?(join_dependency.reflections) &amp;amp;&amp;amp; ((scope &amp;amp;&amp;amp; scope[&lt;span class="sy"&gt;:limit&lt;/span&gt;]) || options[&lt;span class="sy"&gt;:limit&lt;/span&gt;])&lt;tt&gt;
&lt;/tt&gt;    add_limited_ids_condition!(sql, options, join_dependency)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  ....&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  sanitize_sql(sql)&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;add_limited_ids_condition!&lt;/span&gt;(sql, options, join_dependency)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;unless&lt;/span&gt; (id_list = select_limited_ids_list(options, join_dependency)).empty?&lt;tt&gt;
&lt;/tt&gt;    sql &amp;lt;&amp;lt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;condition_word(sql)&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;connection.quote_table_name table_name&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;.&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;primary_key&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; IN (&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;id_list&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;) &lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;else&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    throw &lt;span class="sy"&gt;:invalid_query&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;This doesn’t seem that bad on the first look. But think again. Apart from the control flow retardness, the method &lt;i&gt;add_limited_ids_condition&lt;/i&gt; adds an extra responsibility to the caller – catching &lt;i&gt;invalid_query&lt;/i&gt;. And this is very easy to miss too – as seen with the very same method in question here – &lt;a href="http://github.com/rails/rails/blob/bf00de03dee5fba0b53f0fc1bb19464422550aa9/activerecord/lib/active_record/calculations.rb#L209"&gt;calculations.rb&lt;/a&gt;. Add a few of more throw/catch and you get a proper spaghetti code.&lt;/p&gt;
&lt;p&gt;I think the better way to write the above code is :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;find_with_associations&lt;/span&gt;(options = {})&lt;tt&gt;
&lt;/tt&gt;  join_dependency = &lt;span class="co"&gt;JoinDependency&lt;/span&gt;.new(&lt;span class="pc"&gt;self&lt;/span&gt;, merge_includes(scope(&lt;span class="sy"&gt;:find&lt;/span&gt;, &lt;span class="sy"&gt;:include&lt;/span&gt;), options[&lt;span class="sy"&gt;:include&lt;/span&gt;]), options[&lt;span class="sy"&gt;:joins&lt;/span&gt;])&lt;tt&gt;
&lt;/tt&gt;  rows = select_all_rows(options, join_dependency)&lt;tt&gt;
&lt;/tt&gt;  rows ? join_dependency.instantiate(rows) : []&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;select_all_rows&lt;/span&gt;(options, join_dependency)&lt;tt&gt;
&lt;/tt&gt;  finder_sql = construct_finder_sql_with_included_associations(options, join_dependency)&lt;tt&gt;
&lt;/tt&gt;  connection.select_all(finder_sql, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;name&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; Load Including Associations&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span class="r"&gt;if&lt;/span&gt; finder_sql&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;construct_finder_sql_with_included_associations&lt;/span&gt;(options, join_dependency)&lt;tt&gt;
&lt;/tt&gt;  ....&lt;tt&gt;
&lt;/tt&gt;  limitable = !using_limitable_reflections?(join_dependency.reflections) &amp;amp;&amp;amp; ((scope &amp;amp;&amp;amp; scope[&lt;span class="sy"&gt;:limit&lt;/span&gt;]) || options[&lt;span class="sy"&gt;:limit&lt;/span&gt;])&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;unless&lt;/span&gt; limitable &amp;amp;&amp;amp; add_limited_ids_condition!(sql, options, join_dependency).blank?&lt;tt&gt;
&lt;/tt&gt;    ....&lt;tt&gt;
&lt;/tt&gt;    sanitize_sql(sql)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;add_limited_ids_condition!&lt;/span&gt;(sql, options, join_dependency)&lt;tt&gt;
&lt;/tt&gt;  id_list = select_limited_ids_list(options, join_dependency)&lt;tt&gt;
&lt;/tt&gt;  sql &amp;lt;&amp;lt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;condition_word(sql)&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;connection.quote_table_name table_name&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;.&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;primary_key&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; IN (&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;id_list&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;) &lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; id_list.present?&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;I’d normally say that you should be flexible about following such rules about using a pattern or not using some. But this is an exception. Using throw/catch is just fucking wrong. Plain and simple.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=cZlBK-GmiYA:SMlRp8AEl0M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=cZlBK-GmiYA:SMlRp8AEl0M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=cZlBK-GmiYA:SMlRp8AEl0M:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=cZlBK-GmiYA:SMlRp8AEl0M:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=cZlBK-GmiYA:SMlRp8AEl0M:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=cZlBK-GmiYA:SMlRp8AEl0M:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/cZlBK-GmiYA" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/8/4/ruby-i-don-t-like-2-catch-wtf-throw-wtf</feedburner:origLink></entry>
  <entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-08-03:10998</id>
    <published>2009-08-03T17:16:00Z</published>
    <updated>2009-08-04T17:51:23Z</updated>
    <category term="ruby" />
    <category term="tips" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/cS8UbMbYqOQ/ruby-i-don-t-like-1-explicit-return" rel="alternate" type="text/html" />
    <title>Ruby I don't like #1 - Explicit 'return'</title>
<content type="html">
            &lt;p&gt;In Ruby, you don’t have to specify an explicit &lt;em&gt;return&lt;/em&gt; value from a method. Ruby will just return the last evaluated statement. Similarly, if an explicit &lt;em&gt;return&lt;/em&gt; statement will make itself the last evaluated statement – i.e return control to the caller with the specified return value.&lt;/p&gt;
&lt;p&gt;However, I’m not a big fan of explicit &lt;em&gt;return&lt;/em&gt; statements. In my experience, the only place where they make sense is in the first line of the method, where the control is returned to the caller if the supplied arguments are not valid/expected. Consider the following method :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;read&lt;/span&gt;(file_name, options = &lt;span class="pc"&gt;nil&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;return&lt;/span&gt; &lt;span class="pc"&gt;nil&lt;/span&gt; &lt;span class="r"&gt;unless&lt;/span&gt; &lt;span class="co"&gt;File&lt;/span&gt;.exist?(file_name)&lt;tt&gt;
&lt;/tt&gt;  ....&lt;tt&gt;
&lt;/tt&gt;end&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;I think the above is the only case where I feel it’s ok to use an explicit &lt;em&gt;return&lt;/em&gt; as it’s much better than the alternative – wrapping the entire method in a big if block. Also, you don’t really need to specify &lt;em&gt;nil&lt;/em&gt;. The above can be rewritten as :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;read&lt;/span&gt;(file_name, options = &lt;span class="pc"&gt;nil&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;return&lt;/span&gt; &lt;span class="r"&gt;unless&lt;/span&gt; &lt;span class="co"&gt;File&lt;/span&gt;.exist?(file_name)&lt;tt&gt;
&lt;/tt&gt;  ....&lt;tt&gt;
&lt;/tt&gt;end&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Now the real problem is visible when you look at the full method :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;read&lt;/span&gt;(file_name, options = &lt;span class="pc"&gt;nil&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;return&lt;/span&gt; &lt;span class="pc"&gt;nil&lt;/span&gt; &lt;span class="r"&gt;unless&lt;/span&gt; &lt;span class="co"&gt;File&lt;/span&gt;.exist?(file_name)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;if&lt;/span&gt; expires_in(options) &amp;gt; &lt;span class="i"&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;return&lt;/span&gt; &lt;span class="pc"&gt;nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="co"&gt;File&lt;/span&gt;.open(file_name, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;rb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;) { |f| &lt;span class="co"&gt;Marshal&lt;/span&gt;.load(f) }&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;A much simpler version of the above method is :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;read&lt;/span&gt;(file_name, options = &lt;span class="pc"&gt;nil&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="co"&gt;File&lt;/span&gt;.exist?(file_name) &amp;amp;&amp;amp; expires_in(options) &amp;lt;= &lt;span class="i"&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="co"&gt;File&lt;/span&gt;.open(file_name, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;rb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;) { |f| &lt;span class="co"&gt;Marshal&lt;/span&gt;.load(f) }&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Of course there’s no one ring to rule them all. It might be desirable to use multiple returns in a method. But every time you do that, take a moment to make sure it’s making the code easier to read.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=cS8UbMbYqOQ:8pSHePShL5k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=cS8UbMbYqOQ:8pSHePShL5k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=cS8UbMbYqOQ:8pSHePShL5k:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=cS8UbMbYqOQ:8pSHePShL5k:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=cS8UbMbYqOQ:8pSHePShL5k:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=cS8UbMbYqOQ:8pSHePShL5k:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/cS8UbMbYqOQ" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/8/3/ruby-i-don-t-like-1-explicit-return</feedburner:origLink></entry>
  <entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-07-31:9044</id>
    <published>2009-07-31T18:17:00Z</published>
    <updated>2009-07-31T18:28:17Z</updated>
    <category term="actionpack" />
    <category term="rails" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/mEd7C8OtNYE/stop-returning-false" rel="alternate" type="text/html" />
    <title>Stop returning false from your before filters</title>
<content type="html">
            &lt;p&gt;In the past version of Rails you had to explicitly return &lt;tt&gt;false&lt;/tt&gt; from before filters to halt the filter chain and make sure the action doesn’t get run. The code looked somewhat like :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;AdminController&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ApplicationController&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  before_filter &lt;span class="sy"&gt;:check_admin&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  private&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;check_admin&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;unless&lt;/span&gt; current_user.admin?&lt;tt&gt;
&lt;/tt&gt;      redirect_to home_path&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;return&lt;/span&gt; &lt;span class="pc"&gt;false&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;But since &lt;strong&gt;&lt;a href="http://github.com/rails/rails/commit/f777ff72f931983946cbccbf2c64270922e93d84"&gt;Rails 2.0&lt;/a&gt;&lt;/strong&gt;, If you call &lt;strong&gt;&lt;em&gt;render&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;head&lt;/em&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;i&gt;redirect_to&lt;/i&gt;&lt;/strong&gt; from a &lt;i&gt;before_filter&lt;/i&gt;, the filter chain will be halted. So the above controller will now look like :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;AdminController&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ApplicationController&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  before_filter &lt;span class="sy"&gt;:check_admin&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  private&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;check_admin&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    redirect_to home_path &lt;span class="r"&gt;unless&lt;/span&gt; current_user.admin?&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;You should go ahead and update all your before filters to reflect this change. &lt;i&gt;return false&lt;/i&gt; is nothing but code smell.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=mEd7C8OtNYE:-fZ34D91BwE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=mEd7C8OtNYE:-fZ34D91BwE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=mEd7C8OtNYE:-fZ34D91BwE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=mEd7C8OtNYE:-fZ34D91BwE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=mEd7C8OtNYE:-fZ34D91BwE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=mEd7C8OtNYE:-fZ34D91BwE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/mEd7C8OtNYE" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/7/31/stop-returning-false</feedburner:origLink></entry>
  <entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-07-29:10926</id>
    <published>2009-07-29T19:37:00Z</published>
    <updated>2009-07-29T19:59:03Z</updated>
    <category term="performance" />
    <category term="rails" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/OnXBmxUM1QM/running-rails-performance-tests-on-real-data" rel="alternate" type="text/html" />
    <title>Running Rails performance tests on real data</title>
<content type="html">
            &lt;p&gt;It’s not quite straight forward to run &lt;a href="http://guides.rubyonrails.org/performance_testing.html"&gt;Rails performance tests&lt;/a&gt; on real production data. By default, performance tests will use the &lt;em&gt;test&lt;/em&gt; database and wipe it before using it, thus making it impossible to put real data in the test database.&lt;/p&gt;
&lt;p&gt;To run performance tests on real data:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Create a file called &lt;i&gt;performance_test_helper.rb&lt;/i&gt; inside your &lt;em&gt;test/&lt;/em&gt; directory with the following:&lt;/li&gt;
&lt;/ul&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="c"&gt;# START : HAX HAX HAX&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Load Rails environment in 'test' mode&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;RAILS_ENV&lt;/span&gt; = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;test&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="co"&gt;File&lt;/span&gt;.expand_path(&lt;span class="co"&gt;File&lt;/span&gt;.dirname(&lt;span class="pc"&gt;__FILE__&lt;/span&gt;) + &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;/../config/environment&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# Re-establish db connection for 'performance' mode&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;silence_warnings { &lt;span class="co"&gt;RAILS_ENV&lt;/span&gt; = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;performance&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; }&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;.establish_connection&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# STOP : HAX HAX HAX&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;require_dependency &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;application&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;test/unit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;active_support/test_case&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;action_controller/test_case&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;action_controller/integration&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;performance_test_help&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;ul&gt;
	&lt;li&gt;Replace the following lines in performance tests:&lt;/li&gt;
&lt;/ul&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;test_helper&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;performance_test_help&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;with&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;performance_test_helper&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;ul&gt;
	&lt;li&gt;Supply configuration for &lt;em&gt;‘performance’&lt;/em&gt; environment in your &lt;em&gt;database.yml&lt;/em&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;performance:&lt;tt&gt;
&lt;/tt&gt;  adapter: mysql&lt;tt&gt;
&lt;/tt&gt;  encoding: utf8&lt;tt&gt;
&lt;/tt&gt;  database: database_with_real_data&lt;tt&gt;
&lt;/tt&gt;  pool: &lt;span class="i"&gt;5&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  username: root&lt;tt&gt;
&lt;/tt&gt;  password:&lt;tt&gt;
&lt;/tt&gt;  socket: &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;tmp&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="mod"&gt;m&lt;/span&gt;&lt;/span&gt;ysql.sock&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;The above steps will also make sure that the performance tests use the database &lt;i&gt;database_with_real_data&lt;/i&gt;. Also, the database will not get wiped on every run. You’ll also have to ensure the test database – &lt;i&gt;database_with_real_data&lt;/i&gt; – is up-to-date with the schema changes.&lt;/p&gt;
&lt;p&gt;Now you can just run your performance tests using the usual rake tasks:&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="er"&gt;$&lt;/span&gt; rake test&lt;span class="sy"&gt;:benchmark&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="er"&gt;$&lt;/span&gt; rake test&lt;span class="sy"&gt;:profile&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=OnXBmxUM1QM:UTkDOsjRGPk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=OnXBmxUM1QM:UTkDOsjRGPk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=OnXBmxUM1QM:UTkDOsjRGPk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=OnXBmxUM1QM:UTkDOsjRGPk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=OnXBmxUM1QM:UTkDOsjRGPk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=OnXBmxUM1QM:UTkDOsjRGPk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/OnXBmxUM1QM" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/7/29/running-rails-performance-tests-on-real-data</feedburner:origLink></entry>
  <entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-07-07:10281</id>
    <published>2009-07-07T22:21:00Z</published>
    <updated>2009-07-07T22:21:55Z</updated>
    <category term="rails" />
    <category term="views" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/PNx7Qzmxllg/nested-layouts" rel="alternate" type="text/html" />
    <title>Nested Layouts</title>
<content type="html">
            &lt;p&gt;Don’t think the nested layouts get any simpler in Rails.&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;module&lt;/span&gt; &lt;span class="cl"&gt;ApplicationHelper&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;parent_layout&lt;/span&gt;(layout)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="iv"&gt;@content_for_layout&lt;/span&gt; = &lt;span class="pc"&gt;self&lt;/span&gt;.output_buffer&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="pc"&gt;self&lt;/span&gt;.output_buffer = render(&lt;span class="sy"&gt;:file&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;layouts/&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;layout&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Now using the &lt;i&gt;parent_layout&lt;/i&gt; helper method inside your layouts for nesting :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="c"&gt;# items.html.erb&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;h1&amp;gt;&lt;span class="co"&gt;Just&lt;/span&gt; my items&amp;lt;&lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;h1&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;%= yield %&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;% parent_layout 'master' %&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;and the parent layout of &lt;em&gt;items&lt;/em&gt; – the &lt;em&gt;master&lt;/em&gt; layout :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="c"&gt;# master.html.erb&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;html xmlns=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;http://www.w3.org/1999/xhtml&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; xml&lt;span class="sy"&gt;:lang=&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; lang=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;tt&gt;
&lt;/tt&gt;  &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;&lt;span class="co"&gt;Hello&lt;/span&gt; &lt;span class="co"&gt;World&lt;/span&gt;&amp;lt;&lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;title&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt;head&amp;gt;&lt;tt&gt;
&lt;/tt&gt;  &amp;lt;body&amp;gt;&lt;tt&gt;
&lt;/tt&gt;    &amp;lt;%= &lt;span class="r"&gt;yield&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;&lt;tt&gt;
&lt;/tt&gt;  &amp;lt;/body&lt;/span&gt;&lt;span class="dl"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;&lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;html&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Now, the &lt;em&gt;items&lt;/em&gt; layout will always be wrapped under the &lt;em&gt;master&lt;/em&gt; layout. &lt;strong&gt;Just make sure that the &lt;i&gt;parent_layout&lt;/i&gt; call is always on the last line using &amp;lt;%&lt;/strong&gt;. This technique also works for nesting deeper than a single level.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=PNx7Qzmxllg:96cUfiv9Fxs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=PNx7Qzmxllg:96cUfiv9Fxs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=PNx7Qzmxllg:96cUfiv9Fxs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=PNx7Qzmxllg:96cUfiv9Fxs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=PNx7Qzmxllg:96cUfiv9Fxs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=PNx7Qzmxllg:96cUfiv9Fxs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/PNx7Qzmxllg" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/7/7/nested-layouts</feedburner:origLink></entry>
  <entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-04-22:7832</id>
    <published>2009-04-22T23:40:00Z</published>
    <updated>2009-04-22T23:41:12Z</updated>
    <category term="rails" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/2a_NjmvUmC0/announcing-actionrails" rel="alternate" type="text/html" />
    <title>Announcing ActionRails</title>
<content type="html">
            &lt;p&gt;I’m very happy to announce &lt;a href="http://www.actionrails.com"&gt;ActionRails&lt;/a&gt; – a new consulting firm jointly owned by &lt;a href="http://therailsway.com"&gt;Koz&lt;/a&gt; (Rails core, therailsway.com author), &lt;a href="http://afreshcup.com"&gt;Mike Gunderloy&lt;/a&gt; (Rails documentation/activist team) and myself.&lt;/p&gt;
&lt;p&gt;ActionRails is not trying to be yet another consultancy that develops applications from start to finish (though we can talk to you individually about such projects). Rather, we have a distinct set of services, designed to help customers complete successful Rails deployments and helping existing teams improve their Rails skills. Our menu currently offers:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Application Evaluation&lt;/li&gt;
	&lt;li&gt;Weekly Code Reviews&lt;/li&gt;
	&lt;li&gt;Developer Hotline&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ActionRails has already been working for a few select clients, helping them out with reviewing code, offering course corrections, and evaluating application architecture (among other things). You can hop over to &lt;a href="http://www.actionrails.com"&gt;our site&lt;/a&gt; for more information, or just &lt;a href="http://www.actionrails.com/contact.html"&gt;drop us a line&lt;/a&gt;.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=2a_NjmvUmC0:ixBX_hsFAKM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=2a_NjmvUmC0:ixBX_hsFAKM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=2a_NjmvUmC0:ixBX_hsFAKM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=2a_NjmvUmC0:ixBX_hsFAKM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=2a_NjmvUmC0:ixBX_hsFAKM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=2a_NjmvUmC0:ixBX_hsFAKM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/2a_NjmvUmC0" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/4/22/announcing-actionrails</feedburner:origLink></entry>
  <entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-03-24:7464</id>
    <published>2009-03-24T10:28:00Z</published>
    <updated>2009-03-24T11:01:44Z</updated>
    <category term="activerecord" />
    <category term="rails" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/w-YQF0s6gyY/default-scopes-and-inheritance-to-the-rescue" rel="alternate" type="text/html" />
    <title>Default Scopes and Inheritance to the rescue</title>
<content type="html">
            &lt;p&gt;On my one of the current projects, there are two primary models each with a flag called &lt;em&gt;approved&lt;/em&gt;. 99% of the front end part deals with only approved items. Unapproved items are usually only in the admin panel side of the story. So I started with using a &lt;i&gt;named_scope&lt;/i&gt; called &lt;em&gt;approved&lt;/em&gt;:&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Item&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  has_many &lt;span class="sy"&gt;:tags&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  default_scope &lt;span class="sy"&gt;:order&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;items.name ASC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  named_scope &lt;span class="sy"&gt;:approved&lt;/span&gt;, &lt;span class="sy"&gt;:conditions&lt;/span&gt; =&amp;gt; { &lt;span class="sy"&gt;:published&lt;/span&gt; =&amp;gt; &lt;span class="pc"&gt;true&lt;/span&gt; }&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;And now I’d have to use &lt;em&gt;Item.approved.&amp;lt;whatever&gt;&lt;/em&gt; everywhere in my application. But that became a bit too cumbersome sooner than later. Playing around with this a bit, I came up with the solution using &lt;i&gt;default_scope&lt;/i&gt; and the good ol’ inheritance:&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Item&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  has_many &lt;span class="sy"&gt;:tags&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  default_scope &lt;span class="sy"&gt;:order&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;items.name ASC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;PublishedItem&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;Item&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  set_table_name &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;items&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  set_inheritance_column &lt;span class="pc"&gt;nil&lt;/span&gt; &lt;span class="c"&gt;# hax?&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  default_scope &lt;span class="sy"&gt;:conditions&lt;/span&gt; =&amp;gt; { &lt;span class="sy"&gt;:published&lt;/span&gt; =&amp;gt; &lt;span class="pc"&gt;true&lt;/span&gt; }, &lt;span class="sy"&gt;:order&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;items.name ASC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Checking this on console :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&gt;&gt; p = PublishedItem.first
  SELECT * FROM `items` WHERE (`items`.`published` = 1) ORDER BY items.name ASC LIMIT 1

&gt;&gt; i = Item.first
  SELECT * FROM `items` ORDER BY items.name ASC LIMIT 1&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Seems to work just fine.&lt;/p&gt;
&lt;p&gt;You could do it the other way around too:&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;RawItem&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  set_table_name &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;items&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  has_many &lt;span class="sy"&gt;:tags&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  default_scope &lt;span class="sy"&gt;:order&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;items.name ASC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Item&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;RawItem&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  set_table_name &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;items&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  set_inheritance_column &lt;span class="pc"&gt;nil&lt;/span&gt; &lt;span class="c"&gt;# hax?&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  default_scope &lt;span class="sy"&gt;:conditions&lt;/span&gt; =&amp;gt; { &lt;span class="sy"&gt;:published&lt;/span&gt; =&amp;gt; &lt;span class="pc"&gt;true&lt;/span&gt; }, &lt;span class="sy"&gt;:order&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;items.name ASC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Whichever one works for you.&lt;/p&gt;
&lt;p&gt;Please note that the above code is &lt;em&gt;&lt;span class="caps"&gt;NOT&lt;/span&gt;&lt;/em&gt; using &lt;em&gt;&lt;span class="caps"&gt;STI&lt;/span&gt;&lt;/em&gt;. It’s using &lt;i&gt;set_inheritance_column nil&lt;/i&gt; workaround to bypass the Active Record &lt;span class="caps"&gt;STI&lt;/span&gt; stuff and rely just on the ruby inheritance.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=w-YQF0s6gyY:6v2oJCG1A3E:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=w-YQF0s6gyY:6v2oJCG1A3E:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=w-YQF0s6gyY:6v2oJCG1A3E:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=w-YQF0s6gyY:6v2oJCG1A3E:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=w-YQF0s6gyY:6v2oJCG1A3E:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=w-YQF0s6gyY:6v2oJCG1A3E:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/w-YQF0s6gyY" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/3/24/default-scopes-and-inheritance-to-the-rescue</feedburner:origLink></entry>
  <entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-03-18:7385</id>
    <published>2009-03-18T12:42:00Z</published>
    <updated>2009-03-18T12:42:21Z</updated>
    <category term="documentation" />
    <category term="guides" />
    <category term="rails" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/SPW-aviw1aU/my-rails-guides" rel="alternate" type="text/html" />
    <title>My Rails guides</title>
<content type="html">
            &lt;p&gt;Instead of blogging some of the articles, I decided to write those as Rails guides. So go ahead and check them out !&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://guides.rubyonrails.org/rails_on_rack.html"&gt;Rails on Rack&lt;/a&gt; – Overview of Rails’ Rack integration and middleware/metal interfaces&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://guides.rubyonrails.org/performance_testing.html"&gt;Performance Testing Rails Applications&lt;/a&gt; – Using Rails’ built in performance test suite for profiling and benchmarking your Rails application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also wrote a lot of the &lt;a href="http://guides.rubyonrails.org/active_record_querying.html"&gt;Active Record Query Interface&lt;/a&gt; guide. Of course my guides aren’t really eligible for the &lt;a href="http://hackfest.rubyonrails.org"&gt;guides hackfest prizes&lt;/a&gt;. But hey, you could still win them by &lt;a href="http://guides.rubyonrails.org/contribute.html"&gt;writing a new guide&lt;/a&gt; !&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=SPW-aviw1aU:NzBOnoTrvEY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=SPW-aviw1aU:NzBOnoTrvEY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=SPW-aviw1aU:NzBOnoTrvEY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=SPW-aviw1aU:NzBOnoTrvEY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=SPW-aviw1aU:NzBOnoTrvEY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=SPW-aviw1aU:NzBOnoTrvEY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/SPW-aviw1aU" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/3/18/my-rails-guides</feedburner:origLink></entry>
  <entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-03-17:7368</id>
    <published>2009-03-17T15:49:00Z</published>
    <updated>2009-03-17T15:50:03Z</updated>
    <category term="testing" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/LbPCQlg32qo/assert_-and-assert_not_" rel="alternate" type="text/html" />
    <title>assert_* and assert_not_*</title>
<content type="html">
            &lt;p&gt;Not sure I like this or not, but I’m gonna give it a shot in the “real world” nevertheless.&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;module&lt;/span&gt; &lt;span class="cl"&gt;AssertionExtensions&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;method_missing&lt;/span&gt;(method_id, *arguments, &amp;amp;block)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;return&lt;/span&gt; &lt;span class="r"&gt;super&lt;/span&gt; &lt;span class="r"&gt;unless&lt;/span&gt; method_id.to_s =~ &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;^assert_(not_)?(.*)$&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;    method = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;&lt;span class="gv"&gt;$2&lt;/span&gt;&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;?&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    object = arguments.first&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="gv"&gt;$1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      arguments.each &lt;span class="r"&gt;do&lt;/span&gt; |object|&lt;tt&gt;
&lt;/tt&gt;        assert ! object.send(method), &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;method&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; is not false for &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;object&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;else&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      arguments.each &lt;span class="r"&gt;do&lt;/span&gt; |object|&lt;tt&gt;
&lt;/tt&gt;        assert object.send(method), &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;method&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; is not true for &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;object&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;ActiveSupport::TestCase&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  include &lt;span class="co"&gt;AssertionExtensions&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Now using this in your tests:&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;test_is_admin&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="c"&gt;# [people(:admin), people(:superuser)].each {|p| assert p.admin?}&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  assert_admin people(&lt;span class="sy"&gt;:admin&lt;/span&gt;), people(&lt;span class="sy"&gt;:superuser&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="c"&gt;# assert ! people(:foo).admin?&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  assert_not_admin people(&lt;span class="sy"&gt;:foo&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=LbPCQlg32qo:axlHA3N3pZY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=LbPCQlg32qo:axlHA3N3pZY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=LbPCQlg32qo:axlHA3N3pZY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=LbPCQlg32qo:axlHA3N3pZY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=LbPCQlg32qo:axlHA3N3pZY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=LbPCQlg32qo:axlHA3N3pZY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/LbPCQlg32qo" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/3/17/assert_-and-assert_not_</feedburner:origLink></entry>
  <entry xml:base="http://m.onkey.org/">
    <author>
      <name>pratik</name>
    </author>
    <id>tag:m.onkey.org,2009-03-14:7320</id>
    <published>2009-03-14T12:51:00Z</published>
    <updated>2009-03-14T12:51:38Z</updated>
    <category term="testing" />
    <link href="http://feedproxy.google.com/~r/monkeyonrails/~3/c4GQb4wg8EI/some-t-u" rel="alternate" type="text/html" />
    <title>Make Test::Unit display errors earlier</title>
<content type="html">
            &lt;p&gt;Just a monkey patch to make &lt;em&gt;Test::Unit&lt;/em&gt; display errors as soon as they happen.&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;test/unit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;test/unit/ui/console/testrunner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Test::Unit::UI::Console::TestRunner&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;add_fault&lt;/span&gt;(fault)&lt;tt&gt;
&lt;/tt&gt;    hax_output(fault)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="iv"&gt;@faults&lt;/span&gt; &amp;lt;&amp;lt; fault&lt;tt&gt;
&lt;/tt&gt;    output_single(fault.single_character_display, &lt;span class="i"&gt;1&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="iv"&gt;@already_outputted&lt;/span&gt; = &lt;span class="pc"&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;hax_output&lt;/span&gt;(fault)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="iv"&gt;@io&lt;/span&gt;.puts(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="ch"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    output_single(fault.short_display, &lt;span class="i"&gt;1&lt;/span&gt;) &lt;span class="c"&gt;# fault.long_display for the full trace&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="iv"&gt;@io&lt;/span&gt;.puts(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="ch"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Useful when your tests take too long to run.&lt;/p&gt;
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=c4GQb4wg8EI:uO--XvU7f7g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=c4GQb4wg8EI:uO--XvU7f7g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=c4GQb4wg8EI:uO--XvU7f7g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?i=c4GQb4wg8EI:uO--XvU7f7g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=c4GQb4wg8EI:uO--XvU7f7g:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/monkeyonrails?a=c4GQb4wg8EI:uO--XvU7f7g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/monkeyonrails?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/monkeyonrails/~4/c4GQb4wg8EI" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://m.onkey.org/2009/3/14/some-t-u</feedburner:origLink></entry>
</feed>
