2017-01-22 4 views
1

complètement bloqué sur Ransack le tri avec les associations. Vous voulez trier la liste des produits de différentes marques.Ransack - Tri association action show

Marques Modèle:

class Brand < ApplicationRecord 
    has_many :products 
end 

Controller Marque:

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

Marque Vue:

<%= 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 %> 

Je peux filtrer o n le produit.title sans problèmes, mais le tri ne fonctionne pas. Quelle est mon erreur en pensant?

est ici la sortie de SQL après avoir cliqué sur le tri par titre:

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

Question de débogage: à quoi ressemble votre chaîne de requête après avoir cliqué sur le lien de tri? – coreyward

+0

double possible: http://stackoverflow.com/questions/12065592/rails-sorting-associations-with-ransack – coreyward

Répondre

0

Le Ransack README a ceci à dire sur le tri avec les associations:

Si vous avez des problèmes de tri sur les associations, essayez d'utiliser une chaîne SQL avec la table pluralisée ('departments.title', 'employees.last_name') au lieu de l'association symbolisée (:department_title), :employees_last_name).

Dans votre cas, cela ressemblerait à ceci:

sort_link @q, 'products.title' 
+0

a essayé déjà avant de demander. N'a pas aidé. Aussi après la deuxième édition de vous n'a pas changé cela. Pardon.Comment obtenir la requête SQL en cliquant sur le tri? – Karsten

+0

@Karsten Pouvez-vous partager la requête SQL générée? Il n'y a pas assez d'information pour comprendre ce qui se passe. – coreyward

+0

Comment puis-je obtenir la requête SQL en cliquant sur le tri? Cela n'apparaît pas dans le journal. – Karsten

0

Vous utilisez saccagent pour @ brand.products pas @brand

Dans ce cas, peut essayer quelque chose comme ça dans la vue:

<%= 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

Malheureusement ne aide pas. :( – Karsten

+1

Pourriez-vous s'il vous plaît regarder https://sq-41795404.herokuapp.com/brands/1? Il semble être travaillé pour moi Le code pour cette application Heroku est ici https://github.com/loadkpi/stackoverflow-question-41795404 –

+0

Wow, c'est incroyable, merci pour tout votre travail supplémentaire et en fait votre code m'aide beaucoup.Il ne fonctionne toujours pas avec le code dans votre réponse, mais votre solution Heroku fonctionne et le problème Votre code dans Heroku qui fait le tour est le suivant: <% = @ q.result.map {| p | '

  • ' + p.title + '
  • '} .join.html_safe%>
    Cependant si je référence @ q.products_title, j'obtiens la même erreur – Karsten

    1

    Je résolu ce problème de la manière suivante:

    class Job < ApplicationRecord 
    has_one :address 
    end 
    

    Adresse ressemble

    { street, city, state, zipcode } 
    

    Je voulais trier job.address.street

    Dans mon contrôleur je:

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

    Et à mon avis, j'ai:

    <%= sort_link(@q, :address_street) %>