Confounding URL typists since 2007.
A recurring question I have been seeing regarding MetaSearch has been the need to modify or access the relation generated by the search. That’s precisely why MetaSearch::Builder#relation exists, so I thought I’d make a quick post detailing its usage.
While MetaSearch::Builder is doing its thing, handling your search params, it’s building up an ActiveRecord::Relation that will eventually be used for your results. So, in your controller, you might have:
= Article.search(params[:search])
= .all
You can instead be sure to lazy load those articles in your view by instead doing:
= Article.search(params[:search])
= .relation
You can also do some fun little tricks with scopes, if you’re so inclined:
# article.rb
class Article < ActiveRecord::Base
scope :with_titles_containing_hi, search(:title_contains => 'hi').relation
scope :with_titles_containing_there, search(:title_contains => 'there').relation
end
ruby-1.9.2-p0 > Article.with_titles_containing_hi.
with_titles_containing_there.to_sql
=> "SELECT \"articles\".* FROM \"articles\"
WHERE (\"articles\".\"title\" LIKE '%hi%')
AND (\"articles\".\"title\" LIKE '%there%')"
I tend to prefer using MetaWhere for things like that but it’s a neat trick, all the same.
So, there you have it: MetaSearch::Builder#relation. Use it wisely.