2

我正在使用 rails cast 视频http://railscasts.com/episodes/240-search-sort-paginate-with-ajax。我必须使用两个条件在我的数据库中进行搜索。

# In my form for search 
<%= form_tag products_path, :method => 'get', :id => "products_search" do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil%>
  </p>

对于一种情况,这很好用:

# In my model product.rb
def self.search(search)
  if search
    where(name: /#{Regexp.escape(search)}/i) 
  else
    scoped
  end
end

# In my controller products_controller.rb
@products = Product.search(params[:search]).page(params[:page]).per(5)

现在我必须使用另一个参数进行搜索,role. 我的产品模型中有角色字段。角色是1,2,3。如果给定了角色,那么它应该使用给定的输入角色搜索字符串,否则只搜索名称。

def self.search(search,role)
            if search
where(name: /#{Regexp.escape(search)}/i)(and role: should be equal to value of role)

另外,我应该在我的 products_controller.rb 中做哪些更改?在我上面的搜索表单中?

4

3 回答 3

2

Not sure if role is part of your Product model or not, but if so:

def self.search(paramsname, role = nil) 
  if role
    @products = Product.where(:name => Regexp.new(name, true), :role => role)
  else
    @products = Product.where(:name => Regexp.new(name, true))
  end
end
于 2013-01-01T19:14:35.933 回答
2

将字段添加到您的表单:

<%= form_tag products_path, :method => 'get', :id => 'products_search' do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= select_tag :role, options_for_select([1, 2, 3]) %>
    <%= submit_tag 'Search', :name => nil %>
  </p>
<% end %>

在控制器中使用新:role参数:

@products = Product.search(params[:search], params[:role])
                   .page(params[:page]).per(5)

在您的产品模型中使用新role参数:

def self.search(search, role)
  q = scoped
  if search
    q = q.where(:name => Regexp.new(name, true))
  end

  if role
    q = q.where(:role => role)
  end
  q
end
于 2013-01-03T04:22:44.010 回答
2

我没有测试过,但是看你的问题,似乎你需要更好地分离职责。考虑到这一点,您可能更容易将这些搜索过滤器隔离在单独的类中。

我想出了这个:

    class SearchService
        def self.perform_search(params, klass)
            search = klass.scoped
            search = search.where(:name => Regexp.new(params[:name], true)) if params[:search]
            search = search.where(:role => params[:role]) if params[:role]
            search      
        end
    end

也许有些东西不正确,但我认为您可以理解。

因此,在您的控制器中,您只需将其用作:

    SearchService.perform_search(params, Product)

它仍然不是很好抽象,但我认为这是进入该思路的一种更容易和更好的方法。

希望这可以帮助。

于 2013-01-09T15:40:38.843 回答