ruby-on-railssearchnested-resources

Adding Nested Resources to Search Results


I am creating a rails app where I have implemented the following search function.

application.html.erb

<div class="searchbar">
  <%= form_tag(articles_path, :method => "get", id: "search-form") do %>
    <%= text_field_tag :search, params[:search], placeholder: "    Search", :class => "search_form"  %>
    <%= submit_tag "Search", :name => nil %>
  <% end %>
</div>

article.rb

def self.search(search)
    where("title LIKE ? OR creator LIKE ? OR description LIKE ?", "%#{search}%", "%#{search}%", "%#{search}%") 
end

articles_controller.rb

def index
    @articles = Article.all
    if params[:search]
        @articles = Article.search(params[:search]).order("created_at DESC")
    else
        @articles = Article.all.order("created_at DESC")
    end
end

This allows me to search for all primary resources but does not include nested resources in the search results. Is there a way to include these resources within the same function?


Solution

  • You'd need to do some joins, and define a syntax for passing the relevant join info into your search method.

    This can get complicated pretty quick, and I'd highly suggest you don't reinvent the wheel and use an existing solution such as ransack. This will let you do things like

    Article.ransack(title_cont: "code", author_name_cont: "bob").result

    where, in this example, Author is its own model, associated with Article, and containing the field name.

    It also plays very nice with views and forms, so you can very easily implement search forms without having the manually key everything up to the right association and field.

    (Personally I'm not in love with their concatenation syntax but it gets the job done.)