Je n'ai rien codé depuis des années, alors s'il vous plaît pardonnez mes questions stupides, mais je voudrais regrouper les éléments s'ils sont proches de chacun par horodatage. Je veux dire que les éléments qui sont par exemple à moins de 5 minutes l'un de l'autre seraient groupés récursivement. Par récursif, je veux dire que le premier et le dernier objet ne doivent pas être à moins de 5 minutes l'un de l'autre, mais ils doivent avoir entre eux des objets qui sont tous à moins de 5 minutes de l'élément précédent et suivant. Donc, ce dont j'ai besoin est une façon de comparer l'élément actuel avec l'élément précédent et s'ils sont à moins de 5 minutes l'un de l'autre, l'élément actuel est ajouté au même groupe que l'élément précédent.ROR Groupe par la proximité de l'autre
La solution ActiveRecord serait bien, car la quantité d'articles est très importante!
Le problème est que, en utilisant group_by, je ne trouve pas l'élément précédent, de sorte que je pourrais comparer les horodatages. J'ai essayé quelques trucs stupides comme ça juste pour comparer ces articles:
a.group_by { |x| x.created_at == a[a.index(x)-1].created_at }
Mais je reçois:
NoMethodError: undefined method `created_at' for nil:NilClass
Est-il possible de le faire en utilisant group_by, ou dois-je itérer " manuellement "à travers ces articles? Des suggestions pour une solution assez efficace, car le nombre d'articles est assez important?
Merci!
La raison pour laquelle vous obtenez NoMethodError est probablement parce que la première fois que le bloc de group_by est invoquée, la index est 0 et vous soustrayez 1 de cela et finissez par essayer d'obtenir un [-1] .created_at qui échoue bien sûr. Essayez de penser à une meilleure façon de le faire ... – DanneManne
Oh bien sûr. Mais je n'aime toujours pas l'idée de récupérer le même nœud à partir du hash pour trouver son index, etc. – Charles
Les éléments provenant d'une base de données sont-ils via ActiveRecord ou l'un des ORM? Si c'est le cas, avoir le DBM fait le "figuring" pourrait être un meilleur plan d'attaque. Faire le regroupement en mémoire peut être coûteux, surtout si vous avez beaucoup d'enregistrements. Si c'est le cas, vous pouvez ajouter un tag à votre question pour ActiveRecord ou votre ORM. –