I'm trying to build a search results page in my rails app (still a noob) and I can't figure out how to build a query the rails way.
For example, if no parameters are present I want to return all results. If the user passes 1 to n optional parameters in the search form I want to add them to the query.
Next if they have a sort specified "price desc" or "year_built desc" or even a combination of both.
Finally use will_paginate to separate the results
# default to all listings
@listings = Mls.all
@listings.where("listing_price > ?", params[:listing_price]) unless params[:listing_price].blank?
# ... bunch of other search options ...
@listings.where("property_type = ?", params[:property_type]) unless params[:property_type].blank?
# order
@listings.order("some order by param") if some sort param
@listings.order("some order by param") if some other sort param
# paginate results
@listings.paginate(:page => params[:page])
Is there a "Rails" way of doing this?
ActiveRecord::Base indicates that the ActiveRecord class or module has a static inner class called Base that you're extending.
Active Record allows you to validate the state of a model before it gets written into the database. There are several methods that you can use to check your models and validate that an attribute value is not empty, is unique and not already in the database, follows a specific format, and many more.
Have you seen the (revised) Railscasts episode on advanced searches? Here is the link: http://railscasts.com/episodes/111-advanced-search-form-revised
The basic idea is to create a Search
resource that will process the search params sent in through the form and in the background searches over the model in question (in your case Mls
)
That way, instead of checking in the controller for the presence of certain parameters (e.g. params[:listing_price]
) you could handle the conditions in your Search model (models/search.rb):
def find_listings
listings = Mls.order(:name)
listings = listings.where("listing_price > ?", listing_price) if listing_price.present?
# ... more condition checking
listings
end
A couple of links:
Using third-party gems (metasearch)
Code from scratch
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With