Bonjour,
Je suis tombé sur une requête étrange dont je ne sais pas vraiment comment m’acquitter uniquement avec une requête SQL ou Active Record.
J’ai des sujets avec des champs personnalisés, et je dois trier les données en utilisant la valeur du champ personnalisé ‘importedSortDate’.
Code initial
Topic.where(‘category_id in (?)’, [cat_id])
.where(‘closed = ?’, false)
.order(‘created_at desc’)
.limit(10)
Comment puis-je modifier ou ajouter à cette requête pour charger en mémoire uniquement ces 10 sujets, et pas plus ?
Étant donné que le modèle de la table des champs personnalisés est un peu étrange, dans le sens où vous avez une colonne nom et une colonne valeur, je suis un peu bloqué sur la façon exacte de réaliser cela tout en utilisant la requête de base de données.
Mon problème avec le chargement de plus de données en mémoire est le fait que pour chaque sujet que je charge en mémoire, un fetch de catégorie, d’utilisateur et de publication est également effectué.
Je travaille avec 1000 à 2000 sujets par catégorie, et j’ai 4 catégories à récupérer.
Le fetch est effectué par tous les utilisateurs, ce n’est pas une opération ponctuelle.
À ma connaissance, j’ai jusqu’à présent deux façons de procéder (la première ne me semble pas assez rapide) :
- Récupérer uniquement les IDs de tous les sujets qui m’intéressent en un seul fetch, puis utiliser ces informations pour les joindre d’une manière ou d’une autre à la valeur de ‘importedSortDate’, effectuer un tri en mémoire, puis à nouveau récupérer les IDs dans le même ordre (je ne sais pas exactement comment cela fonctionnerait).
- D’une manière ou d’une autre, créer une requête qui joint la table des champs personnalisés (j’ai vu quelques exemples, mais ils concernaient des valeurs fixes pour les colonnes nom et valeur) et trier le tout en fonction des colonnes ‘name’ === ‘importedSortDate’ et de la colonne ‘value’ (chaîne iso8601).
Comment puis-je réaliser cela ?
PS : Certains sujets peuvent ne pas avoir de valeur dans le champ personnalisé importedSortDate, je pourrais donc simplement les récupérer et les placer où je veux, mais c’est un cas limite que je peux gérer. S’ils n’ont pas de valeur, ils doivent être les premières entrées.
PPS : Je souhaite ensuite utiliser cette requête comme requête de pagination, la logique étant déjà implémentée de ce côté-là. J’ai simplement besoin de modifier la requête principale pour récupérer les sujets.