2010-01-19 6 views
3

Je suis en train de créer un index des articles dans lesquels certains articles ont des photos et d'autres non.Rails trouvés - ordre par présence de la pièce jointe Paperclip puis enregistrement création datetime

Je voudrais saisir tous les éléments (ou un sous-ensemble avec will_paginate) et les trier d'abord par les éléments avec une photo (attachés via Paperclip) puis par la date de création de l'enregistrement.

J'ai besoin d'un état de type binaire "a pièce jointe" pour la première partie. Dois-je créer des attributs de modèle supplémentaires et utiliser les rappels de paperclip pour définir l'état d'une colonne binaire? Ou y a-t-il un meilleur moyen?

Je préférerais faire ce tri au niveau DB car nous utiliserons will_paginate pour parcourir des blocs d'enregistrements.

merci à l'avance

Répondre

2

Parce que nous poursuivent en justice SQLite en dev et postgres dans la production (et peut-être bientôt passer de la production) CONV() n'a pas été disponible.

Nous sommes allés faire une comparaison dans la clause ORDER BY pour créer la valeur binaire nécessaire.

ORDER BY (photo_file_name IS NULL) ASC, created_at DESC 

Cela semble être pris en charge par tous nos DB et atteint l'objectif visé.

3

Vous ne devriez pas avoir besoin de créer un champ supplémentaire, convertir à la place du nom de fichier en booléen à la volée avec CONV (je fais une hypothèse que vous exécutez ce sur MySQL - mais équivalentes fonctions sont disponibles sur d'autres SGBDR). Techniquement, CONV est une fonction permettant de convertir des nombres entre différentes bases, mais il accepte les entrées de type chaîne. Il renverra 0 si une valeur est présente dans la colonne photo_file_name et NULL si elle est NULL.

MySQL CONV Reference

+0

Oui, j'avais pensé à cela, mais ensuite les éléments avec des photos sont triés par nom de fichier à moins qu'ils aient tous le même nom de fichier. – SWR

+0

Et vous voulez vraiment les trier par date de création, les photos d'abord? –

+0

Oui. Je veux donner des priorités aux éléments avec des photos, mais ensuite trier par date de création. Donc, tous les éléments avec des photos sont regroupés, triés par date de création, puis tous les éléments sans photos, à nouveau triés par date de création. – SWR

Questions connexes