Les tableaux en Ruby: Prendre vs Limite par rapport au Premier
Supposons que vous avez un tableau d'objets dans les Rails @objects
Si je veux afficher les 5 premiers objets, quelle est la différence entre l'utilisation:
@objects.limit(5)
@objects.take(5)
@objects.first(5)
Je parle de l'extrémité avant (Ruby), PAS SQL. La raison pour laquelle les objets ne sont pas limitées dans le SQL est parce que le même tableau peut être utilisé ailleurs sans l'application d'une limite à cela.
N'ont rien à voir avec l'instanciation d'objets?
- Êtes-vous sûr que @objets est un Tableau? Je n'ai jamais entendu parler d'un #limite de la méthode. #tout d'abord est une méthode standard pour retourner le premier élément. #prendre est également une méthode.
- Oui
@objects
est un tableau. J'ai appliqué la#limit
méthode et il semblait avoir effectué la même tâche que#take
et#first
. (Dans la vue de ne pas le contrôleur). - n'est probablement pas un tableau mais un ActiveRecord relation. C'est pourquoi l'utilisation de la limite de(5) est de travail.
- Merci! @LarryMcKenzie
Vous devez vous connecter pour publier un commentaire.
Source 2.0 prendre
Source 2.0:
En termes de Rails:
limit(5)
va ajouter le champ d'application delimit(5)
à unActiveRecord::Relation
. Il ne peut pas être appelé sur un tableau, donclimit(5).limit(4)
échouera.first(5)
va ajouter le champ d'application delimit(5)
à unActiveRecord::Relation
. Il peut aussi être appelé sur un tableau donc.first(4).first(3)
sera le même que.limit(4).first(3)
.take(5)
va exécuter la requête dans le champ d'application actuel, de construire tous les objets et retour les 5 premiers. Il ne fonctionne que sur les tableaux, doncModel.take(5)
ne fonctionnera pas, même si les deux autres feront le travail.#limit
n'est pas une méthode de tableau? Je l'ai appliquée à un affichage sur un tableau d'objets@objects
et il a effectué la même tâche que#take
et#first
.#first
peut prendre un argument (facultatif). Essayez-le vous-mêmetake()
peut être appelé sans argument.#take
sur une relation avec également ajouter unlimit
à la requêteLa réponse la réponse choisie semble être obsolète (en termes de Rails) donc je voudrais mettre à jour certaines informations.
limit
sur unActiveRecord::Relation
sera toujours unRelation
. Donc, si vous appelez:sera la même que:
first
sur unActiveRecord::Relation
fera le résultat d'uneArray
. Si vous ne pouvez pas appeler n'importe quel champ d'application aprèsfirst
comme:Mais vous pouvez le faire:
take
fonctionne maintenant. Il retournera un tableau, de sorte que vous ne pouvez pas appeler tout
scope
soit.Sur un
ActiveRecord::Relation
objet, si vous appelezfirst
il comprendraORDER BY 'tables'.id
. Aveclimit
ettake
il n'y a pas deORDER BY
inclus, mais le tri est tributaire de la base de données de tri de mise en œuvre.