Supprimer l'ordre de la portée activeRecord
-
14-11-2019 - |
Question
J'utilise Rails Ransack ( https://github.com/ernie/ransack ) pour permettre aux utilisateurs de filtrer et de trier certains enregistrements. Je reçois les enregistrements filtrés et triés en utilisant des méthodes traditionnelles.
@invoices = Invoice.search(params[:q]).result
Maintenant, je voudrais obtenir des informations de résumé, donc j'ai
@invoices = Invoice.search(params[:q]).result
@summary = @invoices.select("sum(balance) as balance_total").first
Sauf lorsque l'utilisateur spécifie un champ à trier. J'obtiens l'erreur SQL:
Column "project_name" is invalid in the ORDER BY clause because
it is not contained in either an aggregate function or the GROUP BY clause
Puis-je supprimer le tri de la portée? Comment?
Merci
La solution
Vous pouvez appeler le réorganiser Méthode avec une chaîne vide. Par exemple:
> Article.order('headline asc').to_sql
=> "SELECT `articles`.* FROM `articles` ORDER BY headline asc"
> Article.order('headline asc').reorder('').to_sql
=> "SELECT `articles`.* FROM `articles` "
Autres conseils
Vous pouvez également utiliser le unscoped
Méthode de classe dans Rails 3:
class Post < ActiveRecord::Base
default_scope :published => true
end
posts = Post.all #=> SELECT * FROM posts WHERE published = true
posts = Post.unscoped do
Post.all #=> SELECT * FROM posts
end
Dans Rails 2, on l'appelait with_exclusive_scope
.
Voir https://github.com/rails/rails/commit/bd1666ad1de88598ed6f04ceffb8488a77be4385