2010-02-16 6 views
0

Ce code ne télécharge pas la valeur prévue dans la base de données. Je m'attendais à ce que si 2001 existe déjà comme valeur student_number pour un enregistrement qui a un autre site de colonne 1 (représenté par site_id), alors nous incrémentons student_number par 1 donc la prochaine valeur de student_number pour ce site serait 2002 et la prochaine valeur 2003 et ainsi sur. Cependant, pour une raison ici, si 2001 existe, il retourne juste une valeur de 1, puis pour l'enregistrement suivant créé, il retourne une valeur de 1 à nouveau et ainsi de suite:incrémenter la valeur d'une colonne en fonction de la valeur d'une autre colonne

modèle étudiant:

def test! 
update_attributes :updater_id => User.current_user.id, 
:student_number => 
sitenum = self.site_id 
count = Student.count_by_sql("SELECT MAX(student_number) FROM students WHERE site_id = #{sitenum}") 
if count >= 2001 
Student(:condition => { :site_id => sitenum }, 
    :order => "student_number DESC").student_number + 1 
else 
2001 
end 
end 

étudiants contrôleur:

def test_finalize 
if @student.update_attributes(params[:student]) && @student.test! 
@student.save 
end 
end 

Toute idée de la façon d'augmenter par 1 si 2001 existe? Merci pour vos suggestions

+0

et ce qui se passe si une insertion dans la table des élèves se produit au cours? –

Répondre

1

MySQL does this automatically si vous utilisez une clé primaire composite et un seul incrément automatique. Je ne suis pas sûr de la façon dont les autres bases de données le gèrent, donc vous devrez vous y intéresser si vous n'utilisez pas MySQL.

Malheureusement Rails ne fait pas de touches composites prêtes à l'emploi. Il y a un composite_primary_keys plugin. Je n'ai aucune expérience avec ce plugin, donc votre kilométrage peut varier.

Edit: Explication des raisons pour lesquelles le code dans la question ne fonctionne pas:

Il semble que vous attendez le résultat de la condition if être le numéro d'étudiant. Mais c'est ainsi que le code est évalué.

def test! 
    update_attributes :updater_id => User.current_user.id, 
    :student_number => sitenum = self.site_id 

    count = Student.count_by_sql("SELECT MAX(student_number) FROM students WHERE site_id = #{sitenum}") 
    if count >= 2001 
    Student(:condition => { :site_id => sitenum }, 
     :order => "student_number DESC").student_number + 1 
    else 
    2001 
    end 
end 

Le résultat est ce test! renvoie le numéro d'étudiant que vous souhaitez attribuer.

Ce code fait ce que vous avez décrit:

def test! 
    new_number = Student.count_by_sql("SELECT MAX(student_number) FROM students WHERE site_id = #{sitenum}") + 1 
    new_number = new_number > 2000 ? new_number : 2001 
    update_attributes :updater_id => User.current_user.id, 
    :student_number => new_number  
end 
+0

Merci, mais y at-il une raison pour laquelle le code ci-dessus ne fonctionne pas, quand je suppose qu'il devrait. Je ne sais pas pourquoi ça ne marche pas. – JohnMerlino

+0

Ce code est incomplet, sans recevoir la définition complète de la méthode et savoir comment/quand il est appelé, il n'y a aucun moyen de répondre à cette question. – EmFi

+0

Je l'ai mis à jour dans son intégralité. Il n'est utilisé nulle part ailleurs pour changer ses résultats. – JohnMerlino

Questions connexes