2011-11-14 18 views
0

所以我有过这种工作在过去的各种形式,但从来没有一起工作。Rails,如何使用searchlogic重新排序返回的对象

仅供参考我有类别/品牌/产品,有正确的关系工作:该网站是http://emeraldcityguitars.com看到它的行动。

所以在我的品牌控制器show动作:

@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 

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

在我的品牌#表明我做了以下内容:

<%- 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:“为了= ascend_by_price”

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 

我遇到的问题是,如果我点击下拉,做价格最低到最高重新加载页面,用在网址的末尾,但产品的顺序没有变化。

任何帮助表示赞赏。

回答

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) 

我已经拆出来,使其更易于阅读。最后一行指定按顺序参数的值排序,如果不可用,则按默认顺序排序。

+0

我不得不稍微修改,但是这样做了。 –

相关问题