Rails,如何使用searchlogic重新排序返回的对象

时间:2011-11-14 22:38:33

标签: ruby-on-rails searchlogic

所以我在最后一次有各种形式的工作,但从来没有一起工作。

供参考我有类别/品牌/产品,正确的关系有效:网站http://emeraldcityguitars.com可以看到它的实际效果。

所以在我的品牌控制器展示行动:

    @category = Category.find_by_url_name(params[:category_id])
    @brand = Brand.find(params[:id])
    @search = Product.brand_id_equals(@brand.id).category_id_equals(@category.id).descend_by_price
    @products = @search.paginate(:page => params[:page])    

这很好,正如我的日志中所证明的那样:

  Category Load (25.6ms)   SELECT * FROM "categories" 
  Category Load (0.2ms)   SELECT * FROM "categories" WHERE ("categories"."url_name" = 'acoustic-guitars') LIMIT 1
  Brand Load (0.6ms)   SELECT * FROM "brands" WHERE ("brands"."id" = 14) 
  Product Load (4.8ms)   SELECT * FROM "products" WHERE ((products.category_id = 3) AND (products.brand_id = 14)) ORDER BY products.price DESC LIMIT 6 OFFSET 0
  SQL (0.2ms)   SELECT count(*) AS count_all FROM "products" WHERE ((products.category_id = 3) AND (products.brand_id = 14)) 
   Rendering template within layouts/application
   Rendering brands/show

你可以看到它的抓取产品按价格下降。

在我的品牌#show中,我正在做以下事情:

 <%- form_for [@category, @brand], :html => {:method => 'get', :id => 'sort_form', :class => 'sort_form'} do -%>
          <label>Sort by: </label> <%= select_tag :order, product_sort_options %>
          <%= submit_tag 'Go' %>
        <%- end -%>

目标是用户可以通过几种不同的选项进行排序。

我的products_helper中也有这个:

def product_sort_options
    options_for_select([
      ['', nil],
      ['Newest to Oldest', 'descend_by_date'],
      ['Oldest to Newest', 'ascend_by_date'],
      ['Price: Highest to Lowest', 'descend_by_price'],
      ['Price: Lowest to Highest', 'ascend_by_price'],
      ['Name', 'ascend_by_name']
    ])
  end

我遇到的问题是,如果我点击下拉菜单并从最低到最高价格重新加载页面,在网址末尾加上“?order = ascend_by_price”,但顺序没有变化产品

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您需要添加一个调用以包含:order参数的值。如果您正在执行类似Product.search(params[:search])的操作(默认情况下,订单参数必须位于params[:search][:order]),它默认情况下会包含在搜索中。

所以,这样的事情应该有效:

@search = Product.brand_id_equals(@brand.id)
@search.category_id_equals(@category.id)
@search.order(params[:order] || :descend_by_price)

我把它分开以便于阅读。最后一行指定按订单参数的值排序,如果不可用则指定默认排序。