Rails, как использовать searchlogic для изменения порядка возвращаемых объектов - PullRequest
0 голосов
/ 15 ноября 2011

Итак, в последнее время у меня были разные формы этой работы, но никогда не все работали вместе.

для справки У меня есть категории / Бренды / Продукты, с правильными отношениями: сайт 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

Вы можете видеть, что его продукты захвата снижаются по цене.

В моем шоу # бренда я делаю следующее:

 <%- 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" в конце URL, но нет изменений в порядке продуктов.

любая помощь приветствуется.

1 Ответ

0 голосов
/ 15 ноября 2011

Вам нужно добавить в вызов, чтобы включить значение вашего параметра :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)

Я разделил это, чтобы было легче читать. В последней строке указывается порядок по значению параметра заказа или по умолчанию, если он недоступен.

...