Ruby on Rails简单的搜索和范围过滤器

时间:2014-03-25 20:06:07

标签: ruby-on-rails ruby search activerecord scope

我已经从Ryan Bate的轨道演员中设置了一个简单的搜索: http://railscasts.com/episodes/37-simple-search-form

搜索结果显示后,我希望有一些链接可以对已搜索的信息进行排序。对于我的产品型号,他们按名称搜索并获得结果。我想在搜索下有类别链接,以便他们可以按类别过滤搜索结果。 控制器是直截了当的:

def index
  @products = Product.search(params[:search])

#scope filtering
  if params[:toys]
    @products = Product.toys
  end
end

我在模型中添加了范围,但不确定如何将范围和搜索的SQL语句组合在一起。

class Product < ActiveRecord::Base
 scope :electronics, -> { where(category: 'electronics') }
 scope :toys, -> { where(category: 'toys') }

 def self.search(term)
   where("name like :term", term: "%#{term}%")
 end
end

视图:index.html.erb

<%= form_tag products_path, :method => 'get' do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
  </p>

<% end %>
<%= link_to 'Electronics', products_path(:electonrics => true) %> | <%= link_to 'Toys', products_path(:toy => true) %> 

基本上当我搜索表单时会转到localhost:3000 / products?utf8 =✓&amp; search = foo 获得foo的所有结果。然后,当我在搜索后单击过滤器时,我需要某种加入或联合来进行搜索localhost:3000 / products?utf8 =✓&amp; search = foo&amp; category = toys。

如果在用户搜索某个字段后有一种更简单的按类别排序的方法,我确信我和其他人在轨道上学习ruby会感谢看到一种更加红宝石的方法来解决问题。

1 个答案:

答案 0 :(得分:0)

您可以在控制器中执行此操作:

def index
  @products = Product.all
  @products = Product.search(params[:search]) unless params[:search].blank?
  @products = @products.toys unless params[:toys].blank?
end

现在您正在通过@products = Product.toys重置列表。