2012-07-03 3 views
1

Disons que j'ai deux modèles une entreprise et un TimeSlot, et la relation est que business has_many :timeslots. chaque intervalle de temps a une colonne de jour qui stocke les DAYNAME comme 'Monday', 'Tuesday' etc.Rails ActiveRecord comment faire tri personnalisé sur une relation has_many

Quand je

bussiness.time_slots 

Je reçois des intervalles de temps qui ne sont pas triés. Je veux que les intervalles de temps soient triés par jour (pas par ordre alphabétique). fois les slots avec 'Monday' viennent en premier que 'Tuesday' et ainsi de suite.

Je pense que SQL ne peut me aider avec cela parce que le tri est coutume, je dois trier après avoir lu, mais je suis préoccupé par l'endroit où placer le code qui

je peux faire quelque chose comme

dans mon contrôleur

b = current_business 
TimeSlot.find_sorted_with_busines(b) 

dans mon modèle Timeslot

def find_sorted_with_business(b) 
    b.time_slots 
    # sort timeslots using custom sorting here and return 
end 

mais je ne aime pas l'idée de passer un objet métier ou l'identifiant du modèle Timeslot, je devrais être capable de faire quelque chose comme

b = current_business 
b.sorted_timeslots 

comment puis-je faire cela?

idées sur la façon de faire le tri personnalisé basé sur dayNames sont également les bienvenus :)

Merci

+0

Avez-vous envisagé le stockage des entiers au lieu des noms de jour. Cela faciliterait le tri. Et vous pouvez remplacer le getter et le setter pour passer des noms de jour à des nombres entiers ou inversement. Juste une pensée. – Robin

+0

jamais pensé à ça .. ressemble à une bonne idée et je pense que cela aiderait à éliminer beaucoup de désordre. Je vais l'essayer – Abid

+0

@Robin si vous déplacez ceci à une réponse j'accepterai – Abid

Répondre

2

Vous devriez envisager de stocker des entiers dans la base de données au lieu des noms de jour. Cela rendrait les choses plus faciles à trier, et probablement un peu plus performantes.

Ensuite, vous pouvez remplacer le getter day (pour renvoyer le nom du jour de l'entier) et setter (pour stocker l'entier correspondant au nom du jour). Vous ne devrez peut-être pas remplacer le setter en fonction de ce que vous obtenez de votre formulaire.

Ne pas oublier d'avoir une validation personnalisée, pour vérifier si l'entier est compris entre 1 et 7.

+0

a suivi ce qui précède et s'est bien passé. merci :) – Abid

+0

Content de vous aider :) – Robin

1

vous pouvez faire le tri sur mesure avec sql:

SELECT * 
FROM my_table 
ORDER BY CASE 
     WHEN dayname = 'Monday' THEN 1 
     WHEN dayname = 'Tuesday' THEN 2 
     . 
     . 
     WHEN dayname = 'Sunday' THEN 7 
     ELSE 8 
    END 

mais le mieux est d'utiliser seulement un int pour le type de colonne comme robin suggéré et ensuite utiliser le numéro pour obtenir le nom du jour et l'ordre sera plus simple

+0

+1 pour l'option du tri fait sur commande! –

Questions connexes