2017-10-19 25 views
0

Lors d'une mise à jour, vaut-il la peine de voir si l'un des attributs de l'enregistrement a changé avant de lancer un appel db pour mettre à jour l'enregistrement? Un appel devrait encore être fait pour rechercher le dossier.Dois-je vérifier les attributs mis à jour avant d'effectuer un appel db?

Je prévois de ne pas faire d'appels à l'API à la première place, sauf si l'utilisateur met à jour un attribut, mais ne savait pas s'il était bon de mettre un garde dans l'action elle-même. C'est en utilisant Rails et PostgreSQL

Répondre

1

Rails/Activerecord veillera à ce que les mises à jour soient mises à jour lorsque c'est vraiment nécessaire et si les attributs ont changed?. Voici un exemple via la console

Cas où l'enregistrement n'est pas modifié. requête de mise à jour ne se fait pas

[9] pry(main)> user = User.last 
    User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT ? [["LIMIT", 1]] 
    => #<User:0x007fee16801108 ...> 
    [10] pry(main)> user.save 
    (0.1ms) begin transaction #<====== NO UPDATE QUERY IS MADE 
    (0.0ms) commit transaction 
=> true 
[11] pry(main)> 

cas où enregistrement est modifié. La requête de mise à jour est effectuée

[12] pry(main)> user = User.last 
    User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT ? [["LIMIT", 1]] 
=> #<User:0x007fee12c02558 id: 1,...? 
[13] pry(main)> user.name = 'f' 
=> "f" 
[14] pry(main)> user.save 
    (0.1ms) begin transaction #<====== UPDATE QUERY IS MADE 
    SQL (0.3ms) UPDATE "users" SET "name" = ?, "updated_at" = ? WHERE "users"."id" = ? [["name", "f"], ["updated_at", "2017-10-19 06:56:51.385277"], ["id", 1]] 
"complete" 
    (2.2ms) commit transaction 
=> true 
[15] pry(main)> 
0

dépend de comment faire exactement la mise à jour.

ActiveRecord n'effectuera pas la mise à jour réelle à la base de données si le modèle n'est pas dirty.

Vous pouvez comparer la valeur update_at avant et après la mise à jour, et ne déclencher l'API que si elle a été modifiée.

0

Cela dépend de ce dont vous avez besoin.

Tout d'abord, si sa seule colonne, comme dans mon cas, je voulais juste vérifier un seul attribute..state du model..so i utilisé workflow gem. ..et i ajouté callbacks modèle que lorsque cet attribut a changé comme ça ...

##workflow_state is my column name 
after_save :update_other_associations_status , if: :workflow_state_changed? 

de plus, vous pouvez également utiliser column_was par exemple .. workflow_state_was pour vérifier l'ancienne valeur avant de l'enregistrer dans le db.I je le recommande à jeter un oeil à ActiveModel::Dirty Module

En second lieu, si vous voulez vérifier plusieurs valeurs d'un modèle, vous pouvez aller avec le papertrail impressionnant, qui surveille le modèle entier et son hautement configurable quand et où vous devez attraper les changements dans la versions du modèle.

Espérons que cela aide