2017-09-24 2 views
1

Version Rails: Rails 5.1.1Pourquoi update_attributes ne met pas à jour un attribut, mais la mise à jour le fait?

Ruby Version: rubis 2.4.0 [x86_64]

Serveur local:

Puma starting in single mode... 
* Version 3.9.1 (ruby 2.4.0-p0), codename: Private Caller 
* Min threads: 5, max threads: 5 
* Environment: development 
* Listening on tcp://0.0.0.0:3000 

je un existant modèle appelé User et plus tard j'ai ajouté l'attribut last_name.

Puis, en essayant de mettre à jour le nouveau champ (last_name) avec d'autres domaines, je:

user.update_attributes(first_name: 'praaveen', last_name:'vr') 

Pour update_attributes, cela met à jour first_name mais pas l'attribut last_name:

rails log:

UPDATE "users" SET "updated_at" = $1, "first_name" = $2 WHERE "users"."id" = $3 [["updated_at", "2017-09-20 14:19:26.174311"], ["first_name", "praaveen"], ["id", 156]] 

J'ai ensuite essayé avec:

user.update(first_name: 'praaveen', last_name:'vr') 
user.update_columns(first_name: 'praaveen', last_name:'vr') 

Ces méthodes mettent à jour first_nameetlast_name comme prévu.

rails connecter:

UPDATE "users" SET "updated_at" = $1, "first_name" = $2, "last_name" = $3 WHERE "users"."id" = $4 [["updated_at", "2017-09-20 14:15:23.623292"], ["first_name", "praaveen"], ["last_name", "vr"], ["id", 156]] 

Toute idée de ce qui se passe? Ajout de quelques observations

a. Il met à jour au hasard comme une fois dans 10 ou 15 fois la mise à jour.

b. Un problème avec le multi-threading puma?

+0

C'est étrange puisque [ 'update_attributes' est juste un' 'alias' de update'] (https://github.com/rails /rails/blob/5-1-stable/activerecord/lib/active_record/persistence.rb#L289) avez-vous quelque chose de suspect dans le modèle, qui pourrait avoir redéfini cette méthode ou quelque chose? –

+0

@SimpleLime Je n'en ai aucune comme attr_accessible define dans mon modèle User. – praaveen

+0

@praaveen est-ce que 'update_attributes' est écrasé quelque part? Pouvez-vous essayer d'appeler 'Utilisateur. reset_column_information' juste avant l'instruction 'update_attributes' (uniquement à des fins de test)? – ulferts

Répondre

0

Vous risquez d'être confronté à des problèmes d'accès comme décrit here.

Comme expliqué dans l'article:

Faire ce qui suit va allègrement return true, mais pas mettre à jour l'attribut d'état .

@ user.update_attributes (: status => 'actif')

+0

Merci @Fabio Mais je n'ai pas d'attribut attr_accessible define dans mon modèle User. – praaveen

+0

Les accesseurs sont prescriptifs .. Je vais deviner que vous utilisez la Gemme Devise, donc vous pouvez le configurer avec le décrit dans cette réponse: https://stackoverflow.com/a/19793371/4604645 –

+0

@fabio Devise pas sur ce modèle – praaveen