2012-01-13 3 views
4

J'ai des projets et des problèmes. Le numéro d'édition (pas l'ID) doit être auto-incrémenté, mais limité à project_id. Un joyau ou un moyen facile d'accomplir cela? Je vous remercie!Rails: colonne d'incrémentation automatique avec portée

Modifier: acts_as_list fera l'affaire, mais que faire si un enregistrement est supprimé? Le prochain numéro sera avec son numéro.

Répondre

2

dans votre classe d'émission:

belongs_to :project 
before_validation(:on => :create) do 
    self.issue_number = self.project.issues.collect { | issue | issue.issue_number }.max + 1 
end 

(ou à peu près) - essentiellement, avant que le nouvel objet est créé, trouver le numéro d'émission maximum des questions liées au projet de la question, incrément, et l'utilisation Pour le nouveau numéro d'émission ...

+2

Je suppose que je dois avoir un champ numérique dans la table des projets, et juste pour l'incrémenter, parce que sinon, si quelque chose est supprimé, le suivant aura son numéro. Cependant, cette approche est soignée. Je vous remercie. – 7elephant

+0

Il n'est pas rare de simplement définir "destroyed_on" pour un enregistrement (au lieu de le supprimer) et d'appliquer une portée "live" à la plupart des requêtes concernant cette classe. Si vous faites cela, vous pouvez inclure des enregistrements supprimés dans votre requête pour déterminer le numéro de problème suivant. – elijah

+1

Sachez que cela peut être soumis à une condition de concurrence si vous créez plusieurs modèles à la fois. – Kris

0

Vous pouvez utiliser counter_cache sur l'association Project issues et remplacer le decrement_counter de Project pour ne rien faire.