Cela semble être une question très simple mais je n'ai vu de réponse nulle part.
Dans les rails si vous avez:
class Article < ActiveRecord::Base
has_many :comments
end
class Comments < ActiveRecord::Base
belongs_to :article
end
Pourquoi ne pouvez-vous pas commander les commentaires avec quelque chose comme ceci:
@article.comments(:order=>"created_at DESC")
La portée nommée fonctionne si vous avez besoin de la référencer beaucoup et même les gens font des choses comme ceci:
@article.comments.sort { |x,y| x.created_at <=> y.created_at }
Mais quelque chose me dit que ça devrait être plus simple. Qu'est-ce que je rate?
ruby-on-rails
Brian Armstrong
la source
la source
Réponses:
Vous pouvez spécifier l'ordre de tri pour la collection nue avec une option sur
has_many
elle-même:Ou, si vous voulez une méthode de tri simple, sans base de données, utilisez sort_by :
Collecter ceci avec les méthodes de commande ajoutées à ActiveRecord:
Votre kilométrage peut varier: les caractéristiques de performance des solutions ci-dessus changeront énormément en fonction de la manière dont vous récupérez les données en premier lieu et du Ruby que vous utilisez pour exécuter votre application.
la source
-> { order(created_at: :desc) }
plutôt un lambda . Voir: stackoverflow.com/questions/18284606/…À partir de Rails 4, vous feriez:
Pour une
has_many :through
relation, l'ordre des arguments est important (il doit être le deuxième):Si vous voulez toujours aux commentaires d'accès dans le même ordre peu importe le contexte , vous pouvez aussi le faire par l'
default_scope
intérieurComment
comme:Cependant, cela peut être problématique pour les raisons évoquées dans cette question .
Avant Rails 4, vous pouviez spécifier
order
comme clé de la relation, comme:Comme Jim l'a mentionné, vous pouvez également utiliser
sort_by
après avoir récupéré les résultats, bien que dans tous les ensembles de résultats de taille, cela soit beaucoup plus lent (et utilise beaucoup plus de mémoire) que de passer votre commande via SQL / ActiveRecord.Si vous faites quelque chose où l'ajout d'un ordre par défaut est fastidieux pour une raison quelconque ou si vous souhaitez remplacer votre valeur par défaut dans certains cas, il est trivial de le spécifier dans l'action de récupération elle-même:
la source
.order()
à la chaîne de méthodes, comme dans le dernier exemple. Est-ce ce que vous demandez?Si vous utilisez Rails 2.3 et souhaitez utiliser le même ordre par défaut pour toutes les collections de cet objet, vous pouvez utiliser default_scope pour ordonner votre collection.
Alors si vous appelez
Ils seront classés selon votre default_scope. Le classement TBH dans un sens très général est la seule très bonne utilisation des portées par défaut.
la source
Vous pouvez utiliser la méthode find d'ActiveRecord pour récupérer vos objets et les trier également.
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
la source
Et si vous avez besoin de passer des arguments supplémentaires comme
dependent: :destroy
ou autre, vous devez ajouter ceux après un lambda, comme ceci:la source