2017-05-25 1 views
0

Avec Rails 5.1.1 J'ai un problème où le rendu JSON est en quelque sorte "doubler" le nombre de relations.Rails 5.1 api render json doubler les relations

Il existe une relation has_many/belongs_to, rien d'extraordinaire. Un "utilisateur" a beaucoup de "codes". Parcourant la méthode users_controller#update je vois ce qui suit:

Vérifiez ce qui est à venir dans des params:

(byebug) user_params['codes_attributes'].count 
2 

Vérifiez ce qui est enregistré après @user.update(user_params) a été appelé:

(byebug) @user.codes.count 
    (0.4ms) SELECT COUNT(*) FROM "codes" WHERE "codes"."user_id" = ? [["user_id", 85]] 
2 

Enfin, un droit as_json double également via la relation:

(byebug) @user.codes.as_json.count 
4 

Vérifiez ce qui est sortie de as_json (to_json est le même):

(byebug) @user.as_json(include: [:friend, :codes])['codes'].count 
4 
(byebug) @user.codes.count 
    (0.3ms) SELECT COUNT(*) FROM "codes" WHERE "codes"."user_id" = ? [["user_id", 85]] 
2 

Et ici, nous pouvons voir que en quelque sorte le nombre de relations magie doublé! Des idées?

MISE À JOUR

je faisais l'utilisation d'une fonction personnalisée pour sauver les associations (autosave_associated_records_for_codes) qui semble avoir introduit le problème. Je l'ai commenté pour le moment mais j'essaierai de revoir pourquoi exactement cela doublait les choses. Une fois que je découvrirai la cause exacte répondra avec une solution.

+0

ne vous faites quelque chose de bizarre dans la méthode 'as_json' de votre modèle' recueil HSC? – fanta

+0

J'aimerais être ... mais malheureusement je ne le suis pas. J'ai un code personnalisé dans 'Utilisateur # autosave_associated_records_for_codes' dans le cadre de' accept_nested_attributes_for' ... essayant de comprendre si cela est en quelque sorte lié. – krsyoung

+0

Vous n'avez pas montré la sortie 'as_json' – Bartosz

Répondre

0

Je n'ai pas beaucoup d'expérience dans les rails, mais je vous suggère d'essayer cela. Je ne suis pas sûr à ce sujet, mais vous devriez essayer.

def get_codes_count 
    self.codes.count 
    end 

Et si vous voulez un compte, vous pouvez juste faire

@user.as_json(method: :get_codes_count) 
+0

Salut @ bhavesh-waghela merci pour l'idée, je pense que j'ai trouvé le problème (voir UPDATE ci-dessus) mais j'examinerai cette option si les choses continuent de mal se comporter. – krsyoung