<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>RubyGreenBlue::Blog rails</title>
    <link>http://blog.rubygreenblue.com/</link>
    <pubDate>Mon Feb 11 19:00:00 +1100 2008</pubDate>
    <description>RubyGreenBlue::Blog</description>
    <item>
      <title>Using &lt;code&gt;with_scope&lt;/code&gt; the Right Way</title>
      <link>http://blog.rubygreenblue.com/blog/article/with_scope</link>
      <description>&lt;p&gt;Most examples of &lt;code&gt;with_scope&lt;/code&gt; I've seen floating around the web seemed to be to be going about it the wrong way.&lt;/p&gt;

&lt;p&gt;Stuff like this wedged in with some other code:&lt;/p&gt;

&lt;span class="ruby_source"&gt; &lt;pre&gt;&lt;span class="constant"&gt;Article&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;with_scope&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:find&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;&lt;span class="symbol"&gt;:conditions&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;published = 1&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]})&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="constant"&gt;Article&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:all&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;# or some other find operations.&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/span&gt;

&lt;p&gt;To me that's a bit arse-about and even a little messy to stick in the middle of some other code. &lt;/p&gt;

&lt;p&gt;A much nicer way is to use the &lt;code&gt;with_scope&lt;/code&gt; method to help craft one's own specialised find methods. With the following example, the above code could be replaced with a much nicer looking call to &lt;code&gt;Article.find_published(:all)&lt;/code&gt;:&lt;/p&gt;

&lt;span class="ruby_source"&gt; &lt;pre&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Article&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.find_published&lt;/span&gt;&lt;span class="punct"&gt;(*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;with_scope&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:find&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;&lt;span class="symbol"&gt;:conditions&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;published = 1&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;})&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
      &lt;span class="ident"&gt;find&lt;/span&gt;&lt;span class="punct"&gt;(*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/span&gt;

&lt;p&gt;Some other examples of use:&lt;/p&gt;

&lt;span class="ruby_source"&gt; &lt;pre&gt;&lt;span class="attribute"&gt;@published&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Article&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_published&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:all&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="attribute"&gt;@published_today&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Article&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_published&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:all&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:conditions&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;published_at &amp;gt;= :today&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;&lt;span class="symbol"&gt;:today&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Date&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;today&lt;/span&gt;&lt;span class="punct"&gt;}])&lt;/span&gt;
&lt;/pre&gt;&lt;/span&gt;

&lt;p&gt;To me, that is a much neater way to use &lt;code&gt;with_scope&lt;/code&gt;. I also find these type of find methods help remove business logic from controllers and put it back into models where it belongs. The definition of a published article is a matter for a model class rather than a controller.&lt;/p&gt;</description>
      <pubDate>Mon Feb 11 19:00:00 +1100 2008</pubDate>
      <guid>http://blog.rubygreenblue.com/blog/article/with_scope</guid>
      <author>keith</author>
    </item>
  </channel>
</rss>
