<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: sql code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sat, 11 Oct 2008 00:27:38 GMT</pubDate>
    <description>DZone Snippets: sql code</description>
    <item>
      <title>Custom SQL query without find_by_sql</title>
      <link>http://snippets.dzone.com/posts/show/5570</link>
      <description>What if you need to call a custom query in Rails? In most cases you'll be content with ditching ActiveRecord::Base.find and going with .find_by_sql. But instantiating an Active Record per row is expensive. What if you want something faster, but you still want an OO feel? Pop this in your environment.rb (or a separate file) and give this a whirl:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# OO-ified connection.select_all&lt;br /&gt;require 'ostruct'&lt;br /&gt;module ActiveRecord&lt;br /&gt;  class Base&lt;br /&gt;    class &lt;&lt; self&lt;br /&gt;      def select_all(query)&lt;br /&gt;        rows = connection.select_all(query)&lt;br /&gt;        rows.map! do |row|&lt;br /&gt;          row = OpenStruct.new(row)&lt;br /&gt;          table = row.send(:table)&lt;br /&gt;          table.each {|k, v| table[k] = select_type_cast(v) }&lt;br /&gt;          row&lt;br /&gt;        end&lt;br /&gt;        rows&lt;br /&gt;      end&lt;br /&gt;      def select_one(query)&lt;br /&gt;        select_all(query).first&lt;br /&gt;      end&lt;br /&gt;      def select_value(query)&lt;br /&gt;        select_type_cast(connection.select_value(query))&lt;br /&gt;      end&lt;br /&gt;      def select_type_cast(v)&lt;br /&gt;        return unless v&lt;br /&gt;        if md = v.match(/^(\d{4})-(\d{2})-(\d{2})$/)&lt;br /&gt;          Date.new(*md.captures.map(&amp;:to_i)) rescue v&lt;br /&gt;        elsif md = v.match(/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/)&lt;br /&gt;          Time.local(*md.captures.map(&amp;:to_i)) rescue v&lt;br /&gt;        elsif v =~ /^\d+$/&lt;br /&gt;          v.to_i&lt;br /&gt;        elsif v =~ /^\d+(?:\.\d+)+$/&lt;br /&gt;          v.to_f&lt;br /&gt;        else&lt;br /&gt;          v&lt;br /&gt;        end&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 02 Jun 2008 13:04:39 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5570</guid>
      <author>mcmire ()</author>
    </item>
  </channel>
</rss>
