<?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>Snow Giraffe Tech &#187; :include</title>
	<atom:link href="http://www.snowgiraffe.com/tech/tag/include/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.snowgiraffe.com/tech</link>
	<description>rails, rubies, and sometimes dolphins</description>
	<lastBuildDate>Mon, 07 Jun 2010 14:36:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>When to :select and :include your rubies and rails</title>
		<link>http://www.snowgiraffe.com/tech/327/when-to-select-and-include-your-rubies-and-rails/</link>
		<comments>http://www.snowgiraffe.com/tech/327/when-to-select-and-include-your-rubies-and-rails/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 21:16:41 +0000</pubDate>
		<dc:creator>blythe</dc:creator>
				<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[:include]]></category>
		<category><![CDATA[:select]]></category>
		<category><![CDATA[ActiveRecordContext]]></category>
		<category><![CDATA[eager loading]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.snowgiraffe.com/tech/?p=327</guid>
		<description><![CDATA[Although plugins exist to force :select and :include to play nice with ActiveRecord::Base.find, using this approach does not always yield the best performance. The post discusses when to use eager loading and when to use other approaches and the plugins that will help you.]]></description>
			<content:encoded><![CDATA[<div id="attachment_354" class="wp-caption alignleft" style="width: 160px"><img class="size-thumbnail wp-image-354" title="Finger Monkey" src="http://www.snowgiraffe.com/tech/wp-content/uploads/2009/04/mini-monkey-3-150x150.jpg" alt="Every blog post could use a finger monkey" width="150" height="150" /><p class="wp-caption-text">Every blog post could use a finger monkey</p></div>
<p>The vanilla rails ActiveRecord finders do not allow us to specify the <span class="inline_code">:select</span> clause when associations are eager loaded with the <span class="inline_code">:include</span> option. There has been <a href="http://dev.rubyonrails.org/ticket/5371">ticket</a> after <a href="http://dev.rubyonrails.org/attachment/ticket/7147/options_select_working_with_eager_loading.diff" target="_blank">ticket</a> on the rails site the proposed  patches were rejected on the grounds that an alternative, such as <a href="http://svn.techno-weenie.net/projects/plugins/active_record_context/README">ActiveRecordContext</a> (a fantasic plugin by the way) should be used instead.<br />
From the database perspective, selecting fewer columns can give  huge performance boosts in some situations especially when the selected fields are indexed. However, often when joined tables are sparse (many base table records are pointing to the same joined table records), you might be better off running two queries: one on the base table, followed by a second on the join table with the collected foreign keys. To illustrate this, an employee has a fairly unique address while she shares her position in the company with several others.</p>
<pre class="ruby"><span class="constant">Employee</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:all</span><span class="punct">,</span> <span class="symbol">:include</span> <span class="punct">=&gt;</span> <span class="symbol">:position</span></pre>
<p>would probably be less efficient than</p>
<pre class="ruby"><span class="ident">employees</span> <span class="punct">=</span> <span class="constant">Employee</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:all</span>

<span class="ident">positions</span> <span class="punct">=</span> <span class="constant">Positions</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:all</span><span class="punct">,</span> <span class="symbol">:conditions</span> <span class="punct">=&gt;</span> <span class="punct">['</span><span class="string">id in (?)</span><span class="punct">',</span> <span class="ident">employees</span><span class="punct">.</span><span class="ident">collect</span><span class="punct">(&amp;</span><span class="symbol">:id</span><span class="punct">)]</span>

<span class="ident">employees</span><span class="punct">.</span><span class="ident">each</span><span class="punct">{|</span><span class="ident">employee</span><span class="punct">|</span> <span class="ident">employee</span><span class="punct">.</span><span class="ident">position</span> <span class="punct">=</span> <span class="ident">positions</span><span class="punct">.</span><span class="ident">select</span> <span class="punct">{|</span><span class="ident">p</span><span class="punct">|</span> <span class="ident">p</span><span class="punct">.</span><span class="ident">to_param</span> <span class="punct">==</span> <span class="ident">employee</span><span class="punct">.</span><span class="ident">posistion_id</span><span class="punct">}</span></pre>
<p>This is exactly what <a href="http://svn.techno-weenie.net/projects/plugins/active_record_context/README">active record context </a>does but without the messy details. In addition, the records are cached so any subsequent references to the associations hit the cache instead of rerunning a query.</p>
<p><span id="more-327"></span></p>
<pre class="ruby"><span class="ident">employees</span> <span class="punct">=</span> <span class="constant">Employee</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:all</span>
<span class="constant">Positions</span><span class="punct">.</span><span class="ident">preload</span><span class="punct">(</span><span class="ident">employees</span><span class="punct">)</span></pre>
<p>On the other hand, provided that a reasonable number of records are queried, including the address would probably be more efficient.</p>
<pre class="ruby"><span class="constant">Employee</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:all</span><span class="punct">,</span> <span class="symbol">:include</span> <span class="punct">=&gt;</span> <span class="symbol">:address</span><span class="punct">,</span> <span class="symbol">:select</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">addresses.city, employees.*</span><span class="punct">'</span></pre>
<p>In this case wouldn&#8217;t it be great to use a <span class="inline_code">:select</span> clause if for instance you were only interested in for instance the city. To achieve this, I updated the <a href="http://www.snowgiraffe.com/tech/?p=329" target="_self">eload select plugin</a>. It does use some tricky parsing but does have the advantage of accepting aliases and allowing you to select from the base table (some alternates include all base columns).</p>
<p>One disadvantage of using <span class="inline_code">:select</span> is a lot of overhead is spent in rails on aliasing columns. Its really nasty in there and probably the reason that <span class="inline_code">:select</span> is not supported with <span class="inline_code">:include</span> out of the box.</p>
<p>If you really are having performance issues, its probably best to abandon the <span class="inline_code">:include</span> altogether and rewrite it as a :join.</p>
<pre class="ruby"><span class="ident">employees</span> <span class="punct">=</span> <span class="constant">Employee</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:all</span><span class="punct">,</span> <span class="symbol">:select</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">addresses.city as address_city, employees.*</span><span class="punct">',</span>

<span class="symbol">:joins</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">left outer join addresses on addresses.id = employees.address_id</span><span class="punct">'</span>

<span class="ident">employees</span><span class="punct">.</span><span class="ident">first</span><span class="punct">['</span><span class="string">address_city</span><span class="punct">']</span></pre>
<p><img class="alignright size-thumbnail wp-image-356" title="piggy" src="http://www.snowgiraffe.com/tech/wp-content/uploads/2009/04/piggy-150x150.jpg" alt="piggy" width="150" height="150" />Stefan Kaes has written an excellent plugin called <a title="piggy back plugin" href="http://railsexpress.de/svn/plugins/piggy_back/trunk/README" target="_blank">piggy back</a> that does this for you with <span class="inline_code">belongs_to</span> and <span class="inline_code">has_one</span> relationships. For common delegated fields, this plugin is a winner.</p>
<pre class="ruby"><span class="constant">Employees</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:all</span><span class="punct">,</span> <span class="symbol">:piggy</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">address_city</span><span class="punct">'</span>

<span class="ident">employees</span><span class="punct">.</span><span class="ident">first</span><span class="punct">.</span><span class="ident">address_city</span></pre>
<p>So in conclusion, install <a href="http://www.snowgiraffe.com/tech/?p=329">eload-select plugin </a>and you get <span class="inline_code">:select</span> and <span class="inline_code">:include</span> playing happily together. However, sometimes its not the best option out there. There is a huge open source toolbox. Use them wisely.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.snowgiraffe.com/tech/327/when-to-select-and-include-your-rubies-and-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eager loading Select Plugin: when :select plays nice with :include</title>
		<link>http://www.snowgiraffe.com/tech/329/eager-loading-select-plugin-when-select-plays-nice-with-include/</link>
		<comments>http://www.snowgiraffe.com/tech/329/eager-loading-select-plugin-when-select-plays-nice-with-include/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 15:50:26 +0000</pubDate>
		<dc:creator>blythe</dc:creator>
				<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[:include]]></category>
		<category><![CDATA[:select]]></category>
		<category><![CDATA[eager loading]]></category>
		<category><![CDATA[eload-select]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.snowgiraffe.com/tech/?p=329</guid>
		<description><![CDATA[eload-select plugin. Allowing :select to play nice with :include for Ruby on Rails ActiveRecord finders.]]></description>
			<content:encoded><![CDATA[<p>With <span class="inline_code">ActiveRecord::Base.find</span>, <span class="inline_code">:select</span> is ignored when <span class="inline_code">:include</span> is specified. There&#8217;s been many a <a href="http://dev.rubyonrails.org/ticket/5371" target="_blank">ticket</a> and proposed but denied <a href="http://dev.rubyonrails.org/attachment/ticket/7147/options_select_working_with_eager_loading.diff" target="_blank">patch</a> and <a href="http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/7b5b6f40b9735723/e69da924283f7505" target="_blank">google discussion</a> to provide this functionality.</p>
<p>eload-select plugin to the rescue!</p>
<pre class="ruby"><span class="constant">Employee</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:all</span><span class="punct">,</span> <span class="symbol">:select</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">addresses.city, address.state, employees.*</span><span class="punct">',</span>
<span class="symbol">                    :include</span> <span class="punct">=&gt;</span> <span class="symbol">:address</span></pre>
<p>The advantages of the <a href="http://github.com/blythedunham/eload-select/tree/master" target="_blank">eload-select plugin</a>:</p>
<ol>
<li>Works with aliases and database functions</li>
<pre class="ruby"><span class="constant">Employee</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:first</span><span class="punct">,</span>
  <span class="symbol">:select</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">now() as current_time, addresses.city, DATE(addresses.created_at) as addresses.created_at, employee.*</span><span class="punct">'</span>
  <span class="symbol">:include</span> <span class="punct">=&gt;</span> <span class="symbol">:address</span></pre>
<li>Plays nice with other plugins like <a href="http://www.continuousthinking.com/tags/arext" target="_blank">ar-extensions</a></li>
<li>Selects columns on the base table (some options force you to select all of the base table)</li>
<pre class="ruby"><span class="constant">Employee</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:all</span><span class="punct">,</span> <span class="symbol">:select</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">addresses.city, employees.name, employees.start_date</span><span class="punct">',</span>
                    <span class="symbol">:include</span> <span class="punct">=&gt;</span> <span class="symbol">:address</span></pre>
</ol>
<pre>script/plugin install git://github.com/blythedunham/eload-select.git</pre>
<p>And your off! Recently updated to work with all versions of rails including 2.3.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.snowgiraffe.com/tech/329/eager-loading-select-plugin-when-select-plays-nice-with-include/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aliasing MySQL Functions with ActiveRecord</title>
		<link>http://www.snowgiraffe.com/tech/117/aliasing-mysql-functions-with-activerecord/</link>
		<comments>http://www.snowgiraffe.com/tech/117/aliasing-mysql-functions-with-activerecord/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 18:20:43 +0000</pubDate>
		<dc:creator>blythe</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[:group]]></category>
		<category><![CDATA[:include]]></category>
		<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[aliasing]]></category>
		<category><![CDATA[column]]></category>
		<category><![CDATA[eager loading]]></category>
		<category><![CDATA[GROUP BY]]></category>

		<guid isPermaLink="false">http://www.snowgiraffe.com/tech/?p=117</guid>
		<description><![CDATA[Changing column data to use MySQL functions instead of the actual column data for Ruby on Rails ActiveRecord is simple. To allow ActiveRecord to retrieve the data of the function,  alias it to the column name.
Event.find :all, :select =&#62; 'substring(name, 1, 10) as name'
This produces the follow SQL query using MySQL SUBSTRING function:
select substring(name, 1, [...]]]></description>
			<content:encoded><![CDATA[<p>Changing column data to use MySQL functions instead of the actual column data for Ruby on Rails ActiveRecord is simple. To allow ActiveRecord to retrieve the data of the function,  alias it to the column name.</p>
<pre><span class="constant">Event</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:all</span><span class="punct">,</span> <span class="symbol">:select</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">substring(name, 1, 10) as name</span><span class="punct">'</span></pre>
<p>This produces the follow SQL query using MySQL <span class="inline_code">SUBSTRING</span> function:</p>
<pre><span class="mysql">select substring(name, 1, 10) as name from events; </span></pre>
<p>ActiveRecord will pull the truncated <span class="inline_code">name</span> (the first 10 characters) in the function data into the ActiveRecord field <span class="inline_code">name</span>. This can be very useful for offloading some work to <a href="http://dev.mysql.com/doc/refman/5.0/en/functions.html" target="_blank">MySQL by using its operations</a> rather than performing the same functions in memory with Rails code.</p>
<p>Aliasing methods can be useful when combined with the <span class="inline_code">GROUP BY </span> functionality. For example, the following query will count the number of events that start on the same day.</p>
<pre><span class="ident">events</span> <span class="punct">=</span> <span class="constant">Event</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:all</span><span class="punct">,</span> <span class="symbol">:select</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">DATE(start_time) as start_time, count(*) as num_events</span><span class="punct">',</span> <span class="symbol">:group</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">DATE(start_time)</span><span class="punct">'</span></pre>
<h2>Notes and Caveats</h2>
<p>Be aware that several issues exist when using MySQL aliasing with ActiveRecord.</p>
<p><span id="more-117"></span></p>
<h3>Eager Loading</h3>
<p>One note is is that ActiveRecord doesn&#8217;t support <span class="inline_code">:select</span> with eager loading. This means that the <span class="inline_code">:select</span> clause is ignored when <span class="inline_code">:include</span> is specified. To work around this problem (and get a performance benefit by selecting fewer columns), install one of the many eager loading plugins referenced on this <a href="http://dev.rubyonrails.org/ticket/5371 ">ticket</a>. Perhaps there are better ones, but I wrote <a href="http://arperftoolkit.rubyforge.org/svn/trunk/eload_select">eload select</a> and have stuck to it.</p>
<pre>script/plugin install http://arperftoolkit.rubyforge.org/svn/trunk/eload_select</pre>
<h3>Aliased Column vs. MySQL Function</h3>
<p>Another caveat is that due to a <a href="http://bugs.mysql.com/bug.php?id=188">MySQL &#8220;Not a Bug&#8221;</a>, the full function <span class="inline_code">DATE(start_time)</span> must be specified instead of just the alias <span class="inline_code">start_time</span>.  This might seem obvious, but the  <span class="inline_code&gt;GROUP BY&lt;/span&gt; clause:&lt;/p&gt; &lt;pre&gt;&lt;span class=&quot;symbol&quot;&gt;:group&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;DATE(start_time)&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&quot;&lt;/span&gt;&lt;/pre&gt; &lt;p&gt;Using the aliased name start_time use the actual column name instead of the aliased function. This would be more intuitive if &lt;span class=">ORDER BY</span> worked the same way. However,  <span class="inline_code">ORDER BY</span> clause does the opposite and uses the <em> function</em> aliased to <span class="inline_code">name</span> instead of the column <span class="inline_code">name</span>. For example,here the data is sorted on the second letter of the title (the substring function).</p>
<pre><span class="constant">Event</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:all</span><span class="punct">,</span> <span class="symbol">:select</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">substring(title, 2) as title</span><span class="punct">',</span> <span class="symbol"> <img src='http://www.snowgiraffe.com/tech/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> rder</span> <span class="punct">=&gt;'</span><span class="string">title</span><span class="punct">'</span></pre>
<p>which produces this SQL query:</p>
<pre><span class="mysql">select substring(title, 2) as title from events order by title;</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.snowgiraffe.com/tech/117/aliasing-mysql-functions-with-activerecord/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
