<?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>Binary Logic &#187; ordering</title>
	<atom:link href="http://www.binarylogic.com/tag/ordering/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.binarylogic.com</link>
	<description>Ben Johnson's thoughts and programming techniques</description>
	<lastBuildDate>Sat, 23 Jan 2010 21:19:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Tutorial: Pagination, ordering, and searching with Searchlogic</title>
		<link>http://www.binarylogic.com/2008/09/07/tutorial-pagination-ordering-and-searching-with-searchlogic/</link>
		<comments>http://www.binarylogic.com/2008/09/07/tutorial-pagination-ordering-and-searching-with-searchlogic/#comments</comments>
		<pubDate>Sun, 07 Sep 2008 01:05:00 +0000</pubDate>
		<dc:creator>benjohnson</dc:creator>
				<category><![CDATA[Searchlogic]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[ordering]]></category>
		<category><![CDATA[pagination]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[searchgasm]]></category>
		<category><![CDATA[searching]]></category>

		<guid isPermaLink="false">0/2009/03/23/tutorial-pagination-ordering-and-searching-with-searchlogic</guid>
		<description><![CDATA[Paginating, ordering, searching &#8211; no longer a pain in the ass
Maybe it&#8217;s not a pain in the ass for you, maybe it is, or maybe it is and you don&#8217;t know it. We&#8217;ll never know. Either way, this tutorial is pain-in-the-ass free. Guaranteed. That&#8217;s what this is all about, making your life easier when it [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Paginating, ordering, searching &#8211; no longer a pain in the ass</strong></p>
<p>Maybe it&#8217;s not a pain in the ass for you, maybe it is, or maybe it is and you don&#8217;t know it. We&#8217;ll never know. Either way, this tutorial is pain-in-the-ass free. Guaranteed. That&#8217;s what this is all about, making your life easier when it comes to paginating, ordering, and searching. Things you do multiple times in almost every application.</p>
<p>My solution: <a href="http://github.com/binarylogic/searchlogic">Searchlogic</a>. It has saved me a lot time, shortened my code, and ultimately given me the proper tools to paginate, order, and search my data. Hopefully it will do the same for you.</p>
<p>            <span id="more-13"></span></p>
<p>Enough talk, let&#8217;s dive in.</p>
<p>&#8220;Does this really work? Am I about to waste my time?&#8221;. I hope not. But just for you, I made this live example:</p>
<h3><a href="http://searchlogic_example.binarylogic.com">Live example based on this tutorial</a></h3>
<p>Paginating, ordering, and searching doesn&#8217;t get any easier than this. Before we start I want to make the following assumptions about you:</p>
<ol>
<li>You have a working rails application on rails edge (rake rails:freeze:edge)</li>
<li>You have the following model structure: UserGroup =&gt; User =&gt; Order (=&gt; = has_many). Make sure you have the has_many and belongs_to relationships set up. The fields are irrelevant, just change the field names in the view to whatever you have.</li>
</ol>
<div class="spacer5"></div>
<h2>1. Install <a href="http://github.com/binarylogic/searchlogic">Searchlogic</a></h2>
<pre class="cobalt">
$ sudo gem install searchlogic
</pre>
<p>Now add the gem dependency to your rails config:</p>
<pre class="cobalt">
<span class="Comment"><span class="Punctuation">#</span> config/environment.rb</span>
config<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">gem</span></span> <span class="String"><span class="Punctuation">&quot;</span>searchlogic<span class="Punctuation">&quot;</span></span>
</pre>
<p>As always you can install searchlogic as a plugin, but plugins are becoming a thing of the past. I recommend the above approach, but here is the plugin installation if you prefer to do it this way:</p>
<pre class="cobalt">
$ script/plugin install git://github.com/binarylogic/searchlogic.git
</pre>
<div class="spacer5"></div>
<h2>2. Create your controller</h2>
<p>Let&#8217;s create a controller that searches, orders, and paginates users. Like an admin area. Create app/controllers/users_controller.rb with the following content:</p>
<pre class="cobalt">
<span class="Comment"><span class="Punctuation">#</span> app/controllers/users_controller.rb</span>
<span class="Keyword">class</span> <span class="Entity">UsersController<span class="EntityInheritedClass"> <span class="Punctuation">&lt;</span> ApplicationController</span></span>
    <span class="Keyword">def</span> <span class="Entity">index</span>
        <span class="Variable"><span class="Punctuation">@</span>search</span> <span class="Keyword">=</span> <span class="Support">User</span><span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">new_search</span></span><span class="Punctuation">(</span>params<span class="Punctuation">[</span><span class="Constant"><span class="Punctuation">:</span>search</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
        <span class="Variable"><span class="Punctuation">@</span>users</span><span class="Punctuation">,</span> <span class="Variable"><span class="Punctuation">@</span>users_count</span> <span class="Keyword">=</span> <span class="Variable"><span class="Punctuation">@</span>search</span><span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">all</span></span><span class="Punctuation">,</span> <span class="Variable"><span class="Punctuation">@</span>search</span><span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">count</span></span>
    <span class="Keyword">end</span>
<span class="Keyword">end</span>
</pre>
<h3>What did we do here?</h3>
<p>It&#8217;s simple actually, if you haven&#8217;t looked at <a href="http://github.com/binarylogic/searchlogic">Searchlogic</a> I suggest you take a quick glance. I&#8217;m not going to get into crazy detail about what it does, because the README in the library covers that, but to make this short it &#8220;enhances&#8221; searching with ActiveRecord.</p>
<p>Notice that we started a new search with the @search object. This lets you search via an object, which is really handy for your view, which you will see below. It also added in some nifty methods such as page, per_page, order_by, order_as, and a plethora of conditions for each of your columns. The second line does a simple search and counts the results. The thing to remember here is that the .count method ignores pagination. It ignores the limit and offset values. So if you want to know how many users matched the search, use count, not @users.size. If the first page is limited to 10 reconds @user.size will return 10.</p>
<div class="spacer5"></div>
<h2>3. Create the view and your&#8217;re done</h2>
<pre class="cobalt">
# app/views/users/index.html.erb
<span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> <span class="Keyword">if</span> <span class="Variable"><span class="Punctuation">@</span>users_count</span> <span class="Keyword">&gt;</span> <span class="Constant">0</span> <span class="Punctuation">%&gt;</span></span>
    <span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> <span class="Variable"><span class="Punctuation">@</span>users_count</span> <span class="Punctuation">%&gt;</span></span> users found

    <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">table</span> <span class="MetaTagA">border</span>=<span class="String"><span class="Punctuation">&quot;</span>1<span class="Punctuation">&quot;</span></span> <span class="MetaTagA">cellpadding</span>=<span class="String"><span class="Punctuation">&quot;</span>5<span class="Punctuation">&quot;</span></span><span class="Punctuation">&gt;</span></span>
        <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">tr</span><span class="Punctuation">&gt;</span></span>
            <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">th</span><span class="Punctuation">&gt;</span></span><span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> order_by_link <span class="Constant"><span class="Punctuation">:</span>id</span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">th</span><span class="Punctuation">&gt;</span></span>
            <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">th</span><span class="Punctuation">&gt;</span></span><span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> order_by_link <span class="Constant"><span class="Punctuation">:</span>user_group</span> <span class="Punctuation">=&gt;</span> <span class="Constant"><span class="Punctuation">:</span>name</span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">th</span><span class="Punctuation">&gt;</span></span>
            <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">th</span><span class="Punctuation">&gt;</span></span><span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> order_by_link <span class="Constant"><span class="Punctuation">:</span>first_name</span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">th</span><span class="Punctuation">&gt;</span></span>
            <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">th</span><span class="Punctuation">&gt;</span></span><span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> order_by_link <span class="Constant"><span class="Punctuation">:</span>last_name</span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">th</span><span class="Punctuation">&gt;</span></span>
            <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">th</span><span class="Punctuation">&gt;</span></span><span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> order_by_link <span class="Punctuation">[</span><span class="Constant"><span class="Punctuation">:</span>email</span><span class="Punctuation">,</span> <span class="Constant"><span class="Punctuation">:</span>first_name</span><span class="Punctuation">]</span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">th</span><span class="Punctuation">&gt;</span></span>
        <span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">tr</span><span class="Punctuation">&gt;</span></span>
        <span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> <span class="Variable"><span class="Punctuation">@</span>users</span><span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">each</span></span> <span class="Keyword">do </span><span class="Punctuation">|</span><span class="Variable">user</span><span class="Punctuation">|</span> <span class="Punctuation">%&gt;</span></span>
            <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">tr</span><span class="Punctuation">&gt;</span></span>
                <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">td</span><span class="Punctuation">&gt;</span></span><span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> user<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">id</span></span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">td</span><span class="Punctuation">&gt;</span></span>
                <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">td</span><span class="Punctuation">&gt;</span></span><span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> user<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">user_group</span></span> <span class="Keyword">?</span> user<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">user_group</span></span><span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">name</span></span> <span class="Punctuation">:</span> <span class="String"><span class="Punctuation">&quot;</span>-<span class="Punctuation">&quot;</span></span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">td</span><span class="Punctuation">&gt;</span></span>
                <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">td</span><span class="Punctuation">&gt;</span></span><span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> user<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">first_name</span></span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">td</span><span class="Punctuation">&gt;</span></span>
                <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">td</span><span class="Punctuation">&gt;</span></span><span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> user<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">last_name</span></span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">td</span><span class="Punctuation">&gt;</span></span>
                <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">td</span><span class="Punctuation">&gt;</span></span><span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> user<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">email</span></span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">td</span><span class="Punctuation">&gt;</span></span>
            <span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">tr</span><span class="Punctuation">&gt;</span></span>
        <span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> <span class="Keyword">end</span> <span class="Punctuation">%&gt;</span></span>
    <span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">table</span><span class="Punctuation">&gt;</span></span>

    <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">br</span> /<span class="Punctuation">&gt;</span></span>
    <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">br</span> /<span class="Punctuation">&gt;</span></span>

    Per page: <span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> per_page_select <span class="Punctuation">%&gt;</span></span>

    <span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> <span class="Keyword">if</span> <span class="Variable"><span class="Punctuation">@</span>search</span><span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">page_count</span></span> <span class="Keyword">&gt;</span> <span class="Constant">1</span> <span class="Punctuation">%&gt;</span></span>
        <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">br</span> /<span class="Punctuation">&gt;</span></span>Page: <span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> page_select <span class="Punctuation">%&gt;</span></span>
    <span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> <span class="Keyword">end</span> <span class="Punctuation">%&gt;</span></span>
<span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> <span class="Keyword">else</span> <span class="Punctuation">%&gt;</span></span>
    No users were returned
<span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> <span class="Keyword">end</span> <span class="Punctuation">%&gt;</span></span>
</pre>
<h3>What did we do here?</h3>
<p>All that we did was iterate through our users, list them in a table format, and then add page and per_page controls. Notice any unusual helpers? (order_by_link, per_page_select, and page_select). I won&#8217;t go into detail about these helpers because its all <a href="http://searchlogic.rubyforge.org">in the documentation</a> under Searchlogic::Helpers::ControlTypes.</p>
<p>These are only a few ways to use these helpers, this is really just the tip of the iceberg. The sky is the limit: create a select that lets users navigate through the pages, create a list of links (like flickr) that lets you navigate through pages, create a link that lets you order by any number of columns you want, etc. I know ruby has a bad rep when it comes to documentation, but I actually put some decent time into the <a href="http://searchlogic.rubyforge.org">Searchlogic documentation</a> and I think you will find it helpful. That&#8217;s your best resource for finding out everything <a href="http://github.com/binarylogic/searchlogic">Searchlogic</a> has to offer.</p>
<div class="spacer5"></div>
<h2>Adding a search form</h2>
<p>&#8220;This is all great, but you said I could search my data&#8221;. Searching your data is just as easy. Just add this to the top of your index.html.erb</p>
<pre class="cobalt">
# app/views/users/index.html.erb
<span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> form_for <span class="Variable"><span class="Punctuation">@</span>search</span> <span class="Keyword">do </span><span class="Punctuation">|</span><span class="Variable">f</span><span class="Punctuation">|</span> <span class="Punctuation">%&gt;</span></span>
    <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">fieldset</span><span class="Punctuation">&gt;</span></span>
        <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">legend</span><span class="Punctuation">&gt;</span></span>Search Users<span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">legend</span><span class="Punctuation">&gt;</span></span>

        <span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> f<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">fields_for</span></span> <span class="Variable"><span class="Punctuation">@</span>search</span><span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">conditions</span></span> <span class="Keyword">do </span><span class="Punctuation">|</span><span class="Variable">users</span><span class="Punctuation">|</span> <span class="Punctuation">%&gt;</span></span>
            <span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> users<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">label</span></span> <span class="Constant"><span class="Punctuation">:</span>first_name_keywords</span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">br</span> /<span class="Punctuation">&gt;</span></span>
            <span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> users<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">text_field</span></span> <span class="Constant"><span class="Punctuation">:</span>first_name_keywords</span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">br</span> /<span class="Punctuation">&gt;</span></span>
            <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">br</span> /<span class="Punctuation">&gt;</span></span>

            <span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> users<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">fields_for</span></span> users<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">object</span></span><span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">orders</span></span> <span class="Keyword">do </span><span class="Punctuation">|</span><span class="Variable">orders</span><span class="Punctuation">|</span> <span class="Punctuation">%&gt;</span></span>
                <span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> orders<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">label</span></span> <span class="Constant"><span class="Punctuation">:</span>total_gt</span><span class="Punctuation">,</span> <span class="String"><span class="Punctuation">&quot;</span>Has orders with a total greater than<span class="Punctuation">&quot;</span></span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">br</span> /<span class="Punctuation">&gt;</span></span>
                $<span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> orders<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">text_field</span></span> <span class="Constant"><span class="Punctuation">:</span>total_gt</span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">br</span> /<span class="Punctuation">&gt;</span></span>
                <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">br</span> /<span class="Punctuation">&gt;</span></span>
            <span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> <span class="Keyword">end</span> <span class="Punctuation">%&gt;</span></span>

            <span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> users<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">fields_for</span></span> users<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">object</span></span><span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">user_group</span></span> <span class="Keyword">do </span><span class="Punctuation">|</span><span class="Variable">user_group</span><span class="Punctuation">|</span> <span class="Punctuation">%&gt;</span></span>
                <span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> user_group<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">label</span></span> <span class="Constant"><span class="Punctuation">:</span>name_starts_with</span><span class="Punctuation">,</span> <span class="String"><span class="Punctuation">&quot;</span>Belongs to user group with name that starts with<span class="Punctuation">&quot;</span></span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">br</span> /<span class="Punctuation">&gt;</span></span>
                <span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> user_group<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">text_field</span></span> <span class="Constant"><span class="Punctuation">:</span>name_starts_with</span> <span class="Punctuation">%&gt;</span></span><span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">br</span> /<span class="Punctuation">&gt;</span></span>
                <span class="MetaTagA"><span class="Punctuation">&lt;</span><span class="MetaTagA">br</span> /<span class="Punctuation">&gt;</span></span>
            <span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> <span class="Keyword">end</span> <span class="Punctuation">%&gt;</span></span>
        <span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> <span class="Keyword">end</span> <span class="Punctuation">%&gt;</span></span>
    <span class="MetaTagA"><span class="Punctuation">&lt;/</span><span class="MetaTagA">fieldset</span><span class="Punctuation">&gt;</span></span>
    <span class="EmbeddedSource"><span class="Punctuation">&lt;%=</span> f<span class="FunctionCall"><span class="Punctuation">.</span><span class="Entity">submit</span></span> <span class="String"><span class="Punctuation">&quot;</span>Search<span class="Punctuation">&quot;</span></span> <span class="Punctuation">%&gt;</span></span>
<span class="EmbeddedSource"><span class="Punctuation">&lt;%</span> <span class="Keyword">end</span> <span class="Punctuation">%&gt;</span></span>
</pre>
<p>As I mentioned above <a href="http://github.com/binarylogic/searchlogic">Searchlogic</a> creates default conditions on your columns based on the type. Letting you use a form builder to call those conditions. When it receives these conditions on the back-end it will do its &#8220;magic&#8221; and creates the proper SQL. Don&#8217;t worry about SQL injections, <a href="http://github.com/binarylogic/searchlogic">Searchlogic</a> has you covered on that (see <a href="http://searchlogic.rubyforge.org">the documentation</a> for more info).</p>
<p>What&#8217;s great about this method of searching?</p>
<ol>
<li>Your search logic is in one place: the view.</li>
<li>You can add conditions by doing f.text_field &#8220;[column name]_[condition]&#8220;. So when your picky client calls up and says &#8220;Hey, we need a search field for finding emails that end with&#8230;&#8221; No prob: f.text_field :email_ends_with. Done!</li>
<li>You can traverse your relationships with fields_for and set conditions on related objects. Saweet!</li>
</ol>
<div class="spacer5"></div>
<h2>Ajaxified</h2>
<p>So you&#8217;re saying &#8220;this is great, but super old school, where&#8217;s the AJAX?!?!?&#8221; So you&#8217;re all about AJAX? No problem. In the example I have 3 examples: a <a href="http://searchlogic_example.binarylogic.com/non_ajax/users">non AJAX example</a>, an <a href="http://searchlogic_example.binarylogic.com/rails_ajax/users">AJAX example using the built in rails helpers</a>, and <a href="http://searchlogic_example.binarylogic.com/jquery/users">a jQuery AJAX example</a>. Check them out. You can <a href="https://github.com/binarylogic/searchlogic_example">view the source of the examples on github</a> (each example if named spaced into its own controller). On a side note, I highly recommend <a href="http://jquery.com/">jQuery</a>. I recently started using it and love it. I actually get excited to write javascript because I always find something new when digging through the documentation or plugins and unobtrusive javascript never felt so good.</p>
<div class="spacer5"></div>
<h2>Some helpful links</h2>
<p>This tutorial is really just the tip of the ice berg with <a href="http://github.com/binarylogic/searchlogic">Searchlogic</a>. Checkout these links to see all it has to offer:</p>
<ul>
<li><a href="http://searchlogic_example.binarylogic.com">Live example based on this tutorial</a></li>
<li><a href="http://github.com/binarylogic/searchlogic_example">Source code for the live tutorial</a></li>
<li><a href="http://github.com/binarylogic/searchlogic">Searchlogic, the library that makes all of this magic happen</a></li>
<li><a href="http://searchlogic.rubyforge.org">Searchlogic documentation</a></li>
</ul>
<p>I am always interested in hearing feedback. Let me know what you think, what you like, what you don&#8217;t, that you hate the name, etc. I love criticism. <a href="http://github.com/binarylogic/searchlogic">Searchlogic</a> is under active development and I am always trying to improve it. I hope this tutorial was helpful to you and ultimately makes your life easier.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.binarylogic.com/2008/09/07/tutorial-pagination-ordering-and-searching-with-searchlogic/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
	</channel>
</rss>
