2010-12-06 16 views
0

J'ai une liste de villes, chaque ville a une colonne «active» (booléen). Lorsque je mets une ville en activité, je veux que toutes les autres villes soient inactives.définir toutes les entrées sur inactif lorsque l'un est activé

Quelle est la meilleure façon d'y parvenir?

Je pensais à une autre table qui stocke la ville active. Ai-je besoin d'utiliser un singleton pour ça? Si oui, comment puis-je lier ces deux tables?

Je voudrais obtenir quelques exemples sur la façon de résoudre mon problème. Je vous remercie! :-)

Edit: En ce moment je un modèle: Ville

Une ville peut avoir un nom, un code postal et il peut être actif ou inactif - seulement trois colonnes.

Je commence à remplir la base de données avec 5 villes.
Lorsque j'active la ville n ° 1, toutes les autres villes doivent être inactives.
Lorsque j'active la ville 2, toutes les autres villes doivent être inactives.

Pour ce faire, je vois deux façons différentes:
1) Définir un filtre qui met à jour toutes les autres entrées lorsque je sauvegarde une ville.
2) Stocker l'état actif/inactif dans une seconde table.

Option 2) ressemble à une façon plus propre, une table simple avec une seule entrée. Mais à quoi ressemble le modèle dans ce cas?

J'apprécie vraiment vos réponses, les gars. :-) Connaissez-vous ces jours où vous vous sentez stupide? J'ai un de ces jours. :-(

Option 2):
Ce que j'ai, c'est 'City' et 'ActiveCity'.

Ville a:
- Titre: string
- code postal: entier

ActiveCity a:
- actif: booléens
- CITY_ID => Références: Ville

Ville has_one :active_city
ActiveCity belongs_to :city

Dans mon routes.rb il y a:
resources :active_cities
resources :cities

Les travaux suivants:

c = City.find(1) 
ActiveCity.create(:city_id => c, :active => true) 

Quand j'ai plusieurs villes, je peux aussi faire:

c2 = City.find(2) 
ActiveCity.create(:city_id => c2, :active => true) 

Cela signifie que je avoir deux villes actives et c'est maintenant ce que je veux.Qu'est-ce qui est nécessaire pour avoir UNE ville active à tout moment?

Répondre

0

S'il n'y a qu'une seule ville active à la fois, conservez la clé étrangère de la ville dans la table des utilisateurs (ou toute autre table pour laquelle la ville est active). Totalement dépend de vos besoins cependant. Plus d'informations sur le domaine de problème aideraient.

+0

C'est une application pour utilisateur unique - en ce moment il n'y a qu'une seule table (pour les villes). J'ai besoin d'une liste de villes où je peux configurer une ville pour qu'elle soit active. Un cronjob vérifie alors la liste et effectue une action spécifique pour la ville active. Il n'y a rien d'extraordinaire alors je pense qu'une deuxième table juste pour stocker la ville active est la voie à suivre. – dmnkhhn

+0

Oui, je le pense aussi. Ce serait comme si l'utilisateur avait un attribut city_id. 'City has_many: users' et': utilisateur appartient à city'. Une fois la ville active à la fois. – Chirantan

+0

J'ai mis à jour ma question initiale. :-) – dmnkhhn

1

Dans l'option 1, chaque fois que vous souhaitez modifier la ville active, vous effectuez des opérations sur chaque enregistrement de cette table.

Dans l'option 2, chaque fois que vous souhaitez modifier la ville active, vous modifiez 1 enregistrement dans la base de données.

Vous devriez aller avec l'option 2, non seulement pour la performance mais aussi parce qu'elle est logique.

Le modèle dans l'option 2 devrait ressembler à ce que Chirantan dit dans le commentaire à la dernière réponse

+0

A moins d'avoir tout faux avec ma configuration actuelle (j'ai édité ma question initiale) je peux encore avoir beaucoup de villes actives. – dmnkhhn

0

Vous devriez aller pour l'option 2, mais mettre un déclencheur sur la table, de sorte que vous ne pouvez pas insérer plus d'un enregistrement .

+0

C'est ce que j'essayais de faire avec un Singleton car il ne peut y avoir plus d'une ville active. – dmnkhhn

+0

HA doit être un déclencheur ou un autre enregistrement peut être ajouté manuellement. Ce n'est pas quelque chose qui peut être géré efficacement à travers l'application. – HLGEM