240 votes

ActiveRecord : taille vs comte

Dans les Rails, vous pouvez trouver le nombre d’enregistrements à l’aide des et . Si vous avez affaire à des requêtes plus complexes y a-t-il un avantage à utiliser une méthode plutôt que l’autre ? Comment sont-ils différents ?

Par exemple, j’ai des utilisateurs avec des photos. Si je veux montrer une table des utilisateurs et combien de photos qu’ils ont, vous exécutez plusieurs instances de être plus rapide ou plus lent que ?

Merci !

406voto

apneadiving Points 64660

Vous devriez lire que, c'est toujours valide.

Vous pourrez adapter la fonction que vous utilisez en fonction de vos besoins.

En gros:

  • si vous êtes déjà en charge de toutes les entrées, dire User.all, alors vous devez utiliser length afin d'éviter une autre base de données de la requête

  • si vous n'avez pas quelque chose de chargé, utilisez count de faire un nombre de requêtes sur votre base de données

  • si vous ne voulez pas vous embêter avec ces considérations, utilisez size qui va s'adapter

103voto

lime Points 1382

Comme les autres réponses de l'état:

  • count permettra d'effectuer SQL COUNT de la requête
  • length va calculer la longueur de la matrice résultante
  • size va essayer de choisir le plus approprié de les deux pour éviter trop de requêtes

Mais il y a une chose de plus. Nous avons remarqué un cas où l' size qui agit différemment count/lengthtout à fait, et j'ai pensé que je devais le partager car c'est assez rare pour être négligé.

  • Si vous utilisez un :counter_cache sur has_many association, size va utiliser la mise en cache de compter directement, et ne pas faire une requête supplémentaire à tous.

    class Image < ActiveRecord::Base
      belongs_to :product, counter_cache: true
    end
    
    class Product < ActiveRecord::Base
      has_many :images
    end
    
    > product = Product.first  # query, load product into memory
    > product.images.size      # no query, reads the :images_count column
    > product.images.count     # query, SQL COUNT
    > product.images.length    # query, loads images into memory
    

Ce comportement est documenté dans les Rails Guides, mais je l'ai raté la première fois ou vous l'avez oublié.

2voto

Dennis Points 5020

Dire que votre modèle est appelé "Billet".

Ticket.count des requêtes de la base de données pour le nombre d'enregistrements dans la table.

Ticket.all.size des charges jusqu'à une collecte de toutes les données, puis l'envoie à Ruby qui compte la taille de la collection.

@tickets.size est le même que Ticket.all.size.

Si tout ce que vous voulez faire, c'est afficher le nombre d'enregistrements, aller avec Ticket.count. Il devrait être le plus efficace, parce que la base de données n'aurez pas besoin d'envoyer toutes les données de l'application, il suffit d'envoyer le comte.

Merci pour les gens dans le #au système rubyonrails pour clarifier cela pour moi!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X