2010-08-03 5 views
0

J'utilise RoR et je veux faire des requêtes de mise à jour de sécurité simultanée. Par exemple, quand jeRuby On Rails: Comment faire pour exécuter des mises à jour sécurisées

var user = User.find(user_id) 
user.visits += 1 

Je reçois le code SQL suivant:

SELECT * FROM Users WHERE ID=1 -- find user's visits (1) 
UPDATE Users SET Visits=2 WHERE ID=1 -- 1+1=2 

Mais s'il y a plusieurs questions qui se déroulent en même temps, il y aura des problèmes de verrouillage.

Selon l'API RoR, je peux utiliser: lock => true, mais ce n'est pas ce que je veux.

J'ai trouvé une fonction impressionnante update_counters:

User.update_counters(my_user.id, :visits => 1) 

Cela donne le code SQL suivant

UPDATE Users SET Visits=Visits+1 WHERE [email protected] 

fonctionne très bien!

Maintenant, ma question est comment puis-je remplacer la fonction + = pour faire la chose update_counters à la place?

Parce que

user.visits += 1 # better 
User.update_counters(my_user.id, :visits => 1) # than this 

MISE À JOUR

Je viens de créer la fonction suivante

class ActiveRecord::Base 

    def inc(column, value) 

    User.update_counters(self.id, column => value) 

    end 

end 

Existe-t-il d'autres meilleures idées?

Répondre

1

Je ne connais pas de meilleures idées, mais je définirais cette méthode à la classe User, pas l'ActiveRecord. Et peut-être increment_counter (qui utilise update_counters) le rendrait plus lisible?

def inc(column, value) 
    self.increment_counter(column, value) 
end 

avons pas testé cela et ne pas le dire est sans aucun doute une meilleure idée, mais c'est probablement que je le ferais. Et AFAIK vous ne pouvez pas remplacer le "+ =", parce que "a + = b" juste un raccourci pour "a = a + b" et vous ne voulez probablement pas remplacer "=" pour utiliser les update_counters :)

+0

increment_counter l'augmente de 1, parfois j'ai besoin de valeurs différentes. Merci quand même. – Alex

Questions connexes