<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Floorplanner Tech Blog &#187; ActiveRecord</title>
	<atom:link href="http://techblog.floorplanner.com/tag/activerecord/feed/" rel="self" type="application/rss+xml" />
	<link>http://techblog.floorplanner.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Thu, 19 Nov 2009 04:00:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Case-insensitive validates_uniqueness_of slowness</title>
		<link>http://techblog.floorplanner.com/2009/11/17/case-insensitive-validates_uniqueness_of-slowness/</link>
		<comments>http://techblog.floorplanner.com/2009/11/17/case-insensitive-validates_uniqueness_of-slowness/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 14:01:02 +0000</pubDate>
		<dc:creator>Willem van Bergen</dc:creator>
				<category><![CDATA[Databases]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[case insensitive]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[validates_uniqueness_of]]></category>

		<guid isPermaLink="false">http://techblog.floorplanner.com/?p=787</guid>
		<description><![CDATA[Watch out when using validates_uniqueness_of :field, :case_sensitive => false. Rails transforms this in a query that cannot be supported by an index, which will really slow validation down if the underlying table grows larger.
For example, we use validates_uniqueness_of to check for duplicate e-mail addresses. Because email addresses are case-insensitive, adding :case_sensitive => false seems like [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftechblog.floorplanner.com%2F2009%2F11%2F17%2Fcase-insensitive-validates_uniqueness_of-slowness%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftechblog.floorplanner.com%2F2009%2F11%2F17%2Fcase-insensitive-validates_uniqueness_of-slowness%2F" height="61" width="51" /></a></div><p>Watch out when using <code>validates_uniqueness_of :field, :case_sensitive => false</code>. Rails transforms this in a query that cannot be supported by an index, which will really slow validation down if the underlying table grows larger.</p>
<p>For example, we use <code>validates_uniqueness_of</code> to check for duplicate e-mail addresses. Because email addresses are case-insensitive, adding <code>:case_sensitive => false</code> seems like a natural choice. However, this results in the following queries:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family: Monaco,monospace;"><span style="color: #808080; font-style: italic;"># For a new User instance:</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> id <span style="color: #993333; font-weight: bold;">FROM</span> users 
 <span style="color: #993333; font-weight: bold;">WHERE</span> LOWER<span style="color: #66cc66;">&#40;</span>users<span style="color: #66cc66;">.</span>email<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold;">BINARY</span> <span style="color: #ff0000;">'user@example.com'</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># For an existing User instance:</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> id <span style="color: #993333; font-weight: bold;">FROM</span> users 
 <span style="color: #993333; font-weight: bold;">WHERE</span> LOWER<span style="color: #66cc66;">&#40;</span>users<span style="color: #66cc66;">.</span>email<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold;">BINARY</span> <span style="color: #ff0000;">'user@example.com'</span> 
   <span style="color: #993333; font-weight: bold;">AND</span> users<span style="color: #66cc66;">.</span>id <span style="color: #66cc66;">&lt;&gt;</span> <span style="color: #cc66cc;">42</span></pre></div></div>

<p>This query cannot be optimized by a (unique) index on the email field and thus has to scan the full table. As our users table grew larger, these queries started to show up in our slow query log. </p>
<p>However, MySQL uses case-insensitive comparison by default. (To be exact, case-sensitiveness depends on the current collation, which can vary. Rails generates the weird query to make sure the check works, regardless of the current collation.) The conversion to lowercase therefore is not necessary for a uniqueness check (as long as the field has a case-insensitive collation like <code>utf8_general_ci</code>). I decided to write my own validation method that issues a query that can be optimized by a query.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family: Monaco,monospace;">  <span style="color:#008000; font-style:italic;"># Alternative for validates_uniqueness_of :email, :case_sensitive =&gt; false</span>
  validate <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>user<span style="color:#006600; font-weight:bold;">|</span>
    conditions = <span style="color:#996600;">&quot;users.email = :email&quot;</span>
    conditions <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#996600;">&quot; AND users.id != :id&quot;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> user.<span style="color:#9900CC;">new_record</span>?
    conditions = <span style="color:#006600; font-weight:bold;">&#91;</span>conditions, <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:email</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> user.<span style="color:#9900CC;">email</span>, <span style="color:#ff3333; font-weight:bold;">:id</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> user.<span style="color:#9900CC;">id</span> <span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> User.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:first</span>, <span style="color:#ff3333; font-weight:bold;">:select</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:id</span>, <span style="color:#ff3333; font-weight:bold;">:conditions</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> conditions<span style="color:#006600; font-weight:bold;">&#41;</span>
      user.<span style="color:#9900CC;">errors</span>.<span style="color:#9900CC;">add</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:email</span>, <span style="color:#996600;">'Already in use'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>There is <a href="https://rails.lighthouseapp.com/projects/8994/tickets/2503-validates_uniqueness_of-is-horribly-inefficient-in-mysql">a ticket for this issue in Rails&#8217;s Lighthouse</a>, but as of yet this issue is unresolved. For now, this solution works to keep our slow query log nice and quiet!</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.floorplanner.com/2009/11/17/case-insensitive-validates_uniqueness_of-slowness/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>New version of Scoped search</title>
		<link>http://techblog.floorplanner.com/2009/08/31/new-version-of-scoped-search/</link>
		<comments>http://techblog.floorplanner.com/2009/08/31/new-version-of-scoped-search/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 09:37:22 +0000</pubDate>
		<dc:creator>Willem van Bergen</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[LIKE]]></category>
		<category><![CDATA[query language]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[scoped_search]]></category>
		<category><![CDATA[search]]></category>

		<guid isPermaLink="false">http://techblog.floorplanner.com/?p=698</guid>
		<description><![CDATA[After an almost complete rewrite, I am proud to present version 2.0 of scoped_search, the ActiveRecord plugin that makes it easy to find records using a simple query language. This new version support a new query language that supports more complex constructs, and can therefore be used to conduct more fine-grained queries on your models.
New [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftechblog.floorplanner.com%2F2009%2F08%2F31%2Fnew-version-of-scoped-search%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftechblog.floorplanner.com%2F2009%2F08%2F31%2Fnew-version-of-scoped-search%2F" height="61" width="51" /></a></div><p>After an almost complete rewrite, I am proud to present version 2.0 of <a href="http://github.com/wvanbergen/scoped_search">scoped_search</a>, the ActiveRecord plugin that <a href="http://techblog.floorplanner.com/2008/07/26/easy-search-with-activerecord/">makes it easy to find records using a simple query language</a>. This new version support a new query language that supports more complex constructs, and can therefore be used to conduct more fine-grained queries on your models.</p>
<h3>New query language</h3>
<ul>
<li>Logical operators: AND (&amp;, &amp;&amp;), OR (|, ||) and NOT (!, -) operators, and parentheses to structure the boolean logic: <code>police AND (car || uniform), -"village people"</code>. By default, the AND operator is used to combine different segments of your query.</li>
<li>Comparison operators: the most common comparison operators are supported, and to what you expect on integer and date field.</li>
<li>Explicit field support: only search in the specified field instead of all fields: <code>age &gt;= 21</code>, <code>created &lt; 2009-01-01</code>, <code>username != "root"</code>.</li>
<li>Check for NULL fields: <code>null? parent</code>, <code>set? error_message</code></li>
<li>Commas are supported to separate the different parts of the query.</li>
</ul>
<p>More information about <a href="http://wiki.github.com/wvanbergen/scoped_search/query-language">the query language</a> can be found in the project wiki on GitHub.</p>
<h3>New definition syntax</h3>
<p>The new version supports a new syntax to define what fields of your model can be searched and in what cases. An example:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family: Monaco,monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> User <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>   
  belongs_to <span style="color:#ff3333; font-weight:bold;">:account_type</span>
&nbsp;
  scoped_search <span style="color:#ff3333; font-weight:bold;">:on</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:first_name</span>, <span style="color:#ff3333; font-weight:bold;">:last_name</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  scoped_search <span style="color:#ff3333; font-weight:bold;">:on</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:created_at</span>, <span style="color:#ff3333; font-weight:bold;">:alias</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:created</span>, <span style="color:#ff3333; font-weight:bold;">:only_explicit</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>
  scoped_search <span style="color:#ff3333; font-weight:bold;">:in</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:account_type</span>, <span style="color:#ff3333; font-weight:bold;">:on</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:name</span>, <span style="color:#ff3333; font-weight:bold;">:description</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>After the fields have been defined, the <code>search_for</code> method can be used to search your models using a named scope, just like it was before. The <a href="http://wiki.github.com/wvanbergen/scoped_search/search-definition">project wiki</a> has more information about this new syntax. The search syntax itself hasn&#8217;t changed:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family: Monaco,monospace;"><span style="color:#0066ff; font-weight:bold;">@users</span> = User.<span style="color:#9900CC;">search_for</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:q</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">paginate</span><span style="color:#006600; font-weight:bold;">&#40;</span>page <span style="color:#006600; font-weight:bold;">=&gt;</span> params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:page</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<h3>Installation or upgrade</h3>
<p>Include the gem in your <code>environment.rb</code> configuration and run <code>rake gems:install</code> to install it:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family: Monaco,monospace;">config.<span style="color:#9900CC;">gem</span> <span style="color:#996600;">'scoped_search'</span>, <span style="color:#ff3333; font-weight:bold;">:source</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'http://gemcutter.org'</span></pre></div></div>

<h3>Backwards compatibility</h3>
<p>The new version has a new syntax to define the fields that can be searched with a query. This new syntax gives you more fine-grained control over the queries that will be generated, so I urge you to adopt this new syntax. However, the old <code>searchable_on</code> syntax is still available for backwards compatibility.</p>
<p>Please contact me if you have any issues with the new version.</p>
<p><small>(Updated with new gemcutter installation instructions.)</small></p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.floorplanner.com/2009/08/31/new-version-of-scoped-search/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Active OLAP released</title>
		<link>http://techblog.floorplanner.com/2008/07/29/active-olap-released/</link>
		<comments>http://techblog.floorplanner.com/2008/07/29/active-olap-released/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 16:13:10 +0000</pubDate>
		<dc:creator>Willem van Bergen</dc:creator>
				<category><![CDATA[Databases]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[active_olap]]></category>
		<category><![CDATA[OLAP]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://techblog.floorplanner.com/?p=119</guid>
		<description><![CDATA[Remember my post about easy OLAP queries in Rails? I rewrote it almost completely and published is as a Rails plugin for anyone to use on github! It is now called: Active OLAP.
Although it is a complete rewrite, the API I demoed in my previous post should still work with some small changes. The most [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftechblog.floorplanner.com%2F2008%2F07%2F29%2Factive-olap-released%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftechblog.floorplanner.com%2F2008%2F07%2F29%2Factive-olap-released%2F" height="61" width="51" /></a></div><p>Remember my post about easy <a href="http://techblog.floorplanner.com/2008/07/14/easy-olap-queries-in-activerecord/">OLAP queries in Rails</a>? I rewrote it almost completely and published is as a Rails plugin for anyone to use on github! It is now called: <a href="http://github.com/wvanbergen/active_olap">Active OLAP</a>.</p>
<p>Although it is a complete rewrite, the API I demoed in my previous post should still work with some small changes. The most important: you have to enable it for every class you want to use it on with the <code>enable_active_olap</code> method. You can provide a block to this method with dimension definitions, but is not mandatory:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family: Monaco,monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> User <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
&nbsp;
  enable_active_olap <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>olap<span style="color:#006600; font-weight:bold;">|</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># create a simple dimension on the account_type field</span>
    olap.<span style="color:#9900CC;">dimension</span> <span style="color:#ff3333; font-weight:bold;">:account_type</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># create a dimension with custom categories</span>
    <span style="color:#008000; font-style:italic;"># the order of the categories will be kept in the results </span>
    <span style="color:#008000; font-style:italic;"># if you use an array to define the categories.</span>
    olap.<span style="color:#9900CC;">dimension</span> <span style="color:#ff3333; font-weight:bold;">:nationality</span>, <span style="color:#ff3333; font-weight:bold;">:categories</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span>
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:usa</span>, <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:country</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'US'</span> <span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:china</span>, <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:country</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'CN'</span> <span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
      <span style="color:#008000; font-style:italic;"># other is automatically added</span>
    <span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Easily create a trend dimension</span>
    olap.<span style="color:#9900CC;">dimension</span> <span style="color:#ff3333; font-weight:bold;">:created_daily</span>, <span style="color:#ff3333; font-weight:bold;">:trend</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
      <span style="color:#ff3333; font-weight:bold;">:timestamp_field</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:created_at</span>,
      <span style="color:#ff3333; font-weight:bold;">:period_length</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> 1.<span style="color:#9900CC;">day</span>, 
      <span style="color:#ff3333; font-weight:bold;">:period_count</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">20</span>
    <span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Now, we can use these dimensions for our OLAP queries. Multiple dimensions are supported too!</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family: Monaco,monospace;"><span style="color:#008000; font-style:italic;"># simple query</span>
<span style="color:#0066ff; font-weight:bold;">@result</span> = User.<span style="color:#9900CC;">olap_query</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:nationality</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># @result[:usa] == 123, @result[:china] == 456, @result[:other] = 789</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># do drilldown using will_paginate to paginate the results</span>
<span style="color:#008000; font-style:italic;"># olap_drilldown is implemented as a named_scope</span>
<span style="color:#0066ff; font-weight:bold;">@users</span> = User.<span style="color:#9900CC;">olap_drilldown</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:nationality</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:china</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">paginate</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:page</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># multiple dimensions!</span>
<span style="color:#0066ff; font-weight:bold;">@result</span> = User.<span style="color:#9900CC;">olap_query</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:nationality</span>, <span style="color:#ff3333; font-weight:bold;">:created_daily</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#0066ff; font-weight:bold;">@users</span> = User.<span style="color:#9900CC;">olap_drilldown</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:nationality</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:china</span>, 
                        <span style="color:#ff3333; font-weight:bold;">:created_daily</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:period_19</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>I am working on a generic controller that can easily be added to your Rails project. Just define dimensions for your models and the controller will let you execute OLAP queries and display the results as a table or a graph. </p>
<p>Keep an eye on this weblog or the <a href="http://github.com/wvanbergen/active_olap">github project</a> if you want to stay up-to-date! Or, contact me if you have questions, suggestions or want to help out.</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.floorplanner.com/2008/07/29/active-olap-released/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Easy search with ActiveRecord</title>
		<link>http://techblog.floorplanner.com/2008/07/26/easy-search-with-activerecord/</link>
		<comments>http://techblog.floorplanner.com/2008/07/26/easy-search-with-activerecord/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 14:47:35 +0000</pubDate>
		<dc:creator>Willem van Bergen</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[named_scope]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[scoped_search]]></category>
		<category><![CDATA[searching]]></category>

		<guid isPermaLink="false">http://techblog.floorplanner.com/?p=103</guid>
		<description><![CDATA[A couple of minutes ago I released scoped_search, a Rails/ActiveRecord plugin that makes it easy to search your models. It is very easy to use:

Install the plugin in your vendor/plugins directory from http://github.com/wvanbergen/scoped_search
Add the gem to your rails environment.rb:

config.gem 'wvanbergen-scoped_search', :lib =&#62; 'scoped_search', 
    :source =&#62; 'http://gems.github.com'

Call rake gems:install afterwards to ensure the [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftechblog.floorplanner.com%2F2008%2F07%2F26%2Feasy-search-with-activerecord%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftechblog.floorplanner.com%2F2008%2F07%2F26%2Feasy-search-with-activerecord%2F" height="61" width="51" /></a></div><p>A couple of minutes ago I released <a href="http://github.com/wvanbergen/scoped_search">scoped_search</a>, a Rails/ActiveRecord plugin that makes it easy to search your models. It is very easy to use:</p>
<ol>
<li><del datetime="2008-09-20T04:26:19+00:00">Install the plugin in your vendor/plugins directory from <a href="http://github.com/wvanbergen/scoped_search">http://github.com/wvanbergen/scoped_search</a></del><br />
Add the gem to your rails <code>environment.rb</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family: Monaco,monospace;">config.<span style="color:#9900CC;">gem</span> <span style="color:#996600;">'wvanbergen-scoped_search'</span>, <span style="color:#ff3333; font-weight:bold;">:lib</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'scoped_search'</span>, 
    <span style="color:#ff3333; font-weight:bold;">:source</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'http://gems.github.com'</span></pre></div></div>

<p>Call <code>rake gems:install</code> afterwards to ensure the gem is installed.
</li>
<li>Define in what fields your model should be searched by calling<br /> <code>searchable_on :some, :field, :names</code></li>
<li>Find your records by calling <code>search_for("query keywords")</code></li>
</ol>
<p>That&#8217;s all! A short example:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family: Monaco,monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Project <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  searchable_on <span style="color:#ff3333; font-weight:bold;">:name</span>, <span style="color:#ff3333; font-weight:bold;">:description</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Project.<span style="color:#9900CC;">search_for</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;search keywords&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>project<span style="color:#006600; font-weight:bold;">|</span> 
  <span style="color:#CC0066; font-weight:bold;">puts</span> project.<span style="color:#9900CC;">name</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># SELECT * FROM projects WHERE </span>
<span style="color:#008000; font-style:italic;">#      (name LIKE '%search%' OR description LIKE '%search%') </span>
<span style="color:#008000; font-style:italic;">#  AND (name LIKE '%keywords%' OR description LIKE '%keywords%')</span></pre></div></div>

<p>This functionality is completely build upon <a href="http://railscasts.com/episodes/108">named_scope</a>. The <code>search_for</code> method is actually a named scope that was created by the call to <code>searchable_on</code>. Because these scopes can be chained, this offers some great possibilities. </p>
<p>For example, in Floorplanner, we only want you to search on the projects you have access to. We have implemented this access logic in another named scope. The calls can simply be chained:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family: Monaco,monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Project <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  searchable_on <span style="color:#ff3333; font-weight:bold;">:name</span>, <span style="color:#ff3333; font-weight:bold;">:description</span>
&nbsp;
  named_scope <span style="color:#ff3333; font-weight:bold;">:accessible_by</span>, <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>user<span style="color:#006600; font-weight:bold;">|</span> ... <span style="color:#006600; font-weight:bold;">&#125;</span>
  named_scope <span style="color:#ff3333; font-weight:bold;">:published</span>, <span style="color:#ff3333; font-weight:bold;">:conditions</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'published_at IS NOT NULL'</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#0066ff; font-weight:bold;">@projects</span> = Project.<span style="color:#9900CC;">accessible_by</span><span style="color:#006600; font-weight:bold;">&#40;</span>current_user<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">published</span>.<span style="color:#9900CC;">search_for</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'query'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#0066ff; font-weight:bold;">@projects</span>.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>project<span style="color:#006600; font-weight:bold;">|</span> ... <span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>This plugin is released under the MIT license, so please use it for any purpose you see fit. There are some <a href="http://github.com/wvanbergen/scoped_search/tree/master/TODO">TODOs</a>: you currently can not search on fields in other tables, and splitting the search string into keywords is very basic. Please contact me if you have implemented any of these features and you are willing to share them! Do not hesitate to contact me in case or problems either.</p>
<p><strong>Update:</strong> I added support for quotes and the minus sign to the query language:<br />
<code>Project.search_for('willem -"van bergen"').count</code></p>
<p><strong>Update #2:</strong> Wes Hays implemented the <code>OR</code> keyword:<br />
<code>Project.search_for('wes OR hays').count</code>. <br />A big thanks to Wes for helping out on this project!!</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.floorplanner.com/2008/07/26/easy-search-with-activerecord/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Easy OLAP queries in ActiveRecord</title>
		<link>http://techblog.floorplanner.com/2008/07/14/easy-olap-queries-in-activerecord/</link>
		<comments>http://techblog.floorplanner.com/2008/07/14/easy-olap-queries-in-activerecord/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 20:42:18 +0000</pubDate>
		<dc:creator>Willem van Bergen</dc:creator>
				<category><![CDATA[Databases]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[active_olap]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[OLAP]]></category>
		<category><![CDATA[statistics]]></category>

		<guid isPermaLink="false">http://techblog.floorplanner.com/?p=96</guid>
		<description><![CDATA[Because I love statistics so much, I decided to add some neat statistics functionality to the Floorplanner administration interface, so we can get better insight in what is going on. Instead of writing complete OLAP SQL queries myself and adding a custom interface for each one of them so our management can use them (yes [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftechblog.floorplanner.com%2F2008%2F07%2F14%2Feasy-olap-queries-in-activerecord%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftechblog.floorplanner.com%2F2008%2F07%2F14%2Feasy-olap-queries-in-activerecord%2F" height="61" width="51" /></a></div><p>Because I love statistics so much, I decided to add some neat statistics functionality to the Floorplanner administration interface, so we can get better insight in what is going on. Instead of writing complete OLAP SQL queries myself and adding a custom interface for each one of them so our management can use them (yes Jeroen, that means you!), I built an ActiveRecord extension to ease the work. Right now, I only have to define some categories, and it automagically generates the right SQL query to generate charts and tables with the number of records that fall in each category. Moreover, by clicking on these numbers, I can drill down to the individual records.</p>
<p>I can define the categories like this:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family: Monaco,monospace;">olap_definition = <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:categories</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
  <span style="color:#ff3333; font-weight:bold;">:project_is_private</span>   <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:public</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span>, <span style="color:#ff3333; font-weight:bold;">:publishd_at</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">nil</span> <span style="color:#006600; font-weight:bold;">&#125;</span>,
  <span style="color:#ff3333; font-weight:bold;">:project_is_public</span>    <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:public</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>,  <span style="color:#ff3333; font-weight:bold;">:publishd_at</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">nil</span> <span style="color:#006600; font-weight:bold;">&#125;</span>,
  <span style="color:#ff3333; font-weight:bold;">:project_is_published</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'projects.published_at IS NOT NULL'</span>
<span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>Not too hard, was it? Now, I can easily feed this to <code>Project.olap_query</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family: Monaco,monospace;"><span style="color:#0066ff; font-weight:bold;">@query_result</span> = Project.<span style="color:#9900CC;">olap_query</span><span style="color:#006600; font-weight:bold;">&#40;</span>olap_definition<span style="color:#006600; font-weight:bold;">&#41;</span> 
<span style="color:#008000; font-style:italic;"># @query_result == {</span>
<span style="color:#008000; font-style:italic;">#   :project_is_private   =&gt; 123,</span>
<span style="color:#008000; font-style:italic;">#   :project_is_public    =&gt; 456,</span>
<span style="color:#008000; font-style:italic;">#   :project_is_published =&gt; 3,</span>
<span style="color:#008000; font-style:italic;">#   :other                =&gt; 2</span>
<span style="color:#008000; font-style:italic;"># }</span></pre></div></div>

<p>Note that the category <em>other</em> is added automatically, but can be omitted if you wish. (I found that the other-category is nice to spot data integrity problems in your dataset you didn&#8217;t think of beforehand). The result can be used to create a table with the results, plot a pie chart with the Google Charts API. Because this setup is completely generic, this functionality only has to be written once. DRY!</p>
<p>The SQL for other-category is &#8220;calculated&#8221; by OR-ing all the categories and checking whether the result is <code>false</code>, or <code>NULL</code>. The check for <code>NULL</code> is necessary if you have <code>NULL</code>-values in your table: this is a weird characteristic of SQL that defines that <code>TRUE AND NULL</code> equals <code>NULL</code> (see <a href="http://en.wikipedia.org/wiki/Null_(SQL)#Three-valued_logic_.283VL.29">Wikipedia</a>).</p>
<p>The actual SQL query for this example would be:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family: Monaco,monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> 
  SUM<span style="color: #66cc66;">&#40;</span>projects<span style="color: #66cc66;">.</span>public <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #993333; font-weight: bold;">AND</span> projects<span style="color: #66cc66;">.</span>published_at <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> project_is_private<span style="color: #66cc66;">,</span>
  SUM<span style="color: #66cc66;">&#40;</span>projects<span style="color: #66cc66;">.</span>public <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">AND</span> projects<span style="color: #66cc66;">.</span>published_at <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> project_is_public<span style="color: #66cc66;">,</span>
  SUM<span style="color: #66cc66;">&#40;</span>projects<span style="color: #66cc66;">.</span>published_at <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> project_is_published<span style="color: #66cc66;">,</span>
  SUM<span style="color: #66cc66;">&#40;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #66cc66;">&#40;</span>projects<span style="color: #66cc66;">.</span>public <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #993333; font-weight: bold;">AND</span> projects<span style="color: #66cc66;">.</span>published_at <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OR</span>
    <span style="color: #66cc66;">&#40;</span>projects<span style="color: #66cc66;">.</span>public <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">AND</span> projects<span style="color: #66cc66;">.</span>published_at <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OR</span>
    <span style="color: #66cc66;">&#40;</span>projects<span style="color: #66cc66;">.</span>published_at <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #66cc66;">&#40;</span>projects<span style="color: #66cc66;">.</span>public <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #993333; font-weight: bold;">AND</span> projects<span style="color: #66cc66;">.</span>published_at <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OR</span>
    <span style="color: #66cc66;">&#40;</span>projects<span style="color: #66cc66;">.</span>public <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">AND</span> projects<span style="color: #66cc66;">.</span>published_at <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OR</span>
    <span style="color: #66cc66;">&#40;</span>projects<span style="color: #66cc66;">.</span>published_at <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> other
<span style="color: #993333; font-weight: bold;">FROM</span> projects</pre></div></div>

<p>Some notes about this query:</p>
<ul>
<li>It is complety built using the fragments from the categories. The fragment for the other-cagegory is a little verbose, but what do I care? It works and is generated automatically! <img src='http://techblog.floorplanner.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
<li>Note that a record can be in multiple categories, depending on the category definitions. The other category only contains records that conform to none of the provided categories.</li>
<li><code>SUM</code> is used in stead of <code>COUNT</code>. This way, I can query all the categories at once and it solves the problems with <code>NULL</code>-values, while keeping my <code>WHERE</code> and <code>GROUP BY</code> clause nice and clean <img src='http://techblog.floorplanner.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  </li>
<li>The query is built completely using ActiveRecords <code>find</code> method by using <a href="http://railscasts.com/episodes/112">anonymous scopes</a>. Therefore, Rails 2.1 is required, but this makes some neat tricks possible as well.
</ul>
<p>I also have a <code>Project.olap_drilldown</code> method that I can use to find the individual projects in a category:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family: Monaco,monospace;"><span style="color:#0066ff; font-weight:bold;">@projects</span> = Project.<span style="color:#9900CC;">olap_drilldown</span><span style="color:#006600; font-weight:bold;">&#40;</span>olap_definition, <span style="color:#ff3333; font-weight:bold;">:project_is_public</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># SELECT projects.* FROM projects </span>
<span style="color:#008000; font-style:italic;"># WHERE (projects.public = 1 AND projects.published_at IS NULL)</span>
&nbsp;
<span style="color:#0066ff; font-weight:bold;">@projects</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>project<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> project.<span style="color:#9900CC;">name</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Because this functionality is built on anonymous scopes, it offers some interesting additional functionality. You can use your own scopes to limit the input dataset</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family: Monaco,monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Project <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  named_scope <span style="color:#ff3333; font-weight:bold;">:recent</span>, <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:conditions</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> 
              <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'created_at &gt; ?'</span>, <span style="color:#CC00FF; font-weight:bold;">Time</span>.<span style="color:#9900CC;">now</span> <span style="color:#006600; font-weight:bold;">-</span> 7.<span style="color:#9900CC;">days</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
  ...
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#008000; font-style:italic;"># This will add a WHERE-clause to the OLAP query</span>
results = Project.<span style="color:#9900CC;">recent</span>.<span style="color:#9900CC;">olap_query</span><span style="color:#006600; font-weight:bold;">&#40;</span>olap_definition<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Or, use :conditions for the same effect</span>
results = Project.<span style="color:#9900CC;">olap_query</span><span style="color:#006600; font-weight:bold;">&#40;</span>olap_definition.<span style="color:#9900CC;">merge</span><span style="color:#006600; font-weight:bold;">&#40;</span>
            <span style="color:#ff3333; font-weight:bold;">:conditions</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'created_at &gt; ?'</span>, <span style="color:#CC00FF; font-weight:bold;">Time</span>.<span style="color:#9900CC;">now</span> <span style="color:#006600; font-weight:bold;">-</span> 7.<span style="color:#9900CC;">days</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>As I noted before, the <code>GROUP BY</code>-clause is not used. I already built an extension to use the <code>GROUP BY</code> clause to group the results in periods of a given timestamp field of the model (e.g. <code>created_by</code>). When I pass the result of such a query to the Google Chart API, I can generate trend graphs to see how my dataset is evolving.</p>
<p>If I have time and there is any interest, I may release this extension as a gem or Rails plugin.</p>
<p><strong>UPDATE:</strong> I <a href="http://techblog.floorplanner.com/2008/07/29/active-olap-released/">rewrote it</a> and released this project on <a href="http://github.com/wvanbergen/active_olap/">github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.floorplanner.com/2008/07/14/easy-olap-queries-in-activerecord/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
