2017-01-22 3 views
1

Полностью застрял на Сортировка Ransack с Ассоциациями. Хотите отсортировать список продуктов из разных брендов.Ransack - Сортировочная ассоциация в шоу-действии

Бренды Модель:

class Brand < ApplicationRecord 
    has_many :products 
end 

Марка контроллера:

def show 
    @brand = Brand.find(params[:id]) 
    @q = @brand.products.ransack(params[:q]) 
end 

Марка Вид:

<%= search_form_for @q, url: products_path(params[:id]) do |f| %> 
     <%= f.search_field :brand_products_title_cont %> 
     <%= sort_link(@q, :brand_products_id)%> 
     <%= sort_link @q, :brand_products_title %> 
<% end %> 

Я могу фильтровать о n product.title без проблем, но сортировка не работает. Какова моя ошибка в мышлении?

Вот выход SQL после нажатия на сортировке по названию:

Brand Load (0.3ms) SELECT `brands`.* FROM `brands` WHERE `brands`.`id` = 2 LIMIT 1 

    CACHE (0.0ms) SELECT `brands`.* FROM `brands` WHERE `brands`.`id` = 2 LIMIT 1 [["id", 2], ["LIMIT", 1]] 

    Rendering brands/show.html.erb within layouts/application 
    Product Load (19.5ms) SELECT `products`.* FROM `products` WHERE `products`.`brand_id` = ‚BRANDNAME' 
+0

Отладочный вопрос: как выглядит ваша строка запроса после нажатия на ссылку сортировки? – coreyward

+0

Возможный дубликат: http://stackoverflow.com/questions/12065592/rails-sorting-associations-with-ransack – coreyward

ответ

0

Ransack README это сказать о сортировке с ассоциациями:

Если у вас возникли проблемы сортировки на ассоциациях, попробуйте использовать строку SQL с таблицей с множественным доступом ('departments.title', 'employees.last_name') вместо символизированной ассоциации (:department_title),), :employees_last_name).

В вашем случае, это будет выглядеть следующим образом:

sort_link @q, 'products.title' 
+0

Уже пробовал это, прежде чем спрашивать. Не помогло. Также после второго редактирования вы не изменили это. Сожалею.Как получить запрос SQL от выбора сортировки? – Karsten

+0

@Karsten Вы можете поделиться сгенерированным SQL-запросом? Недостаточно информации, чтобы понять, что происходит. – coreyward

+0

Как получить запрос SQL от нажатия сортировки? Он не отображается в журнале. – Karsten

0

Вы используете рыскать для @ brand.products не для @brand

В этом случае вы может попробовать что-то вроде этого в Вид:

<%= search_form_for @q, url: brand_path(params[:id]) do |f| %> 
    # Search if the name field contains... 
    <%= f.search_field :title_cont %> 
    <%= sort_link(@q, :id)%> 
    <%= sort_link @q, :title %> 
<% end %> 
+0

К сожалению, это не поможет. :( – Karsten

+1

Не могли бы вы посмотреть https://sq-41795404.herokuapp.com/brands/1? Кажется, что это сработало для меня. Код для этого приложения Heroku находится здесь https://github.com/loadkpi/stackoverflow-question-41795404 –

+0

Ничего себе, это потрясающе. Спасибо за всю вашу дополнительную работу, и на самом деле ваш код мне очень помогает. Он по-прежнему не работает с кодом в вашем ответе, но ваше решение Heroku работает, и проблема определенно в поле зрения. Ваш код в Heroku, который делает трюк, таков: <% = @ q.result.map {| p | '

  • ' + p.title + '
  • '} .join.html_safe%>
    Однако, если я ссылаюсь на @ q.products_title, я получаю ту же ошибку. – Karsten

    1

    Я решил эту проблему следующим образом:

    class Job < ApplicationRecord 
    has_one :address 
    end 
    

    Адрес выглядит

    { street, city, state, zipcode } 
    

    Я хотел сортировать по job.address.street

    В моем контроллере у меня есть:

    @q = Job.ransack(params[:query]) 
    @q.sorts = params.dig(:q, :s) || 'id asc' 
    

    И, на мой взгляд, у меня есть:

    <%= sort_link(@q, :address_street) %> 
    
    Смежные вопросы