2017-09-30 22 views
0

Je suis en train de personnaliser un champ sur un objet cancancan:Cancancan Sélectionner un champ

projectsAPI = Project.accessible_by(current_ability).select('projects.name, projects.price * 5 as new_price') 
respond_to do |format| 
     format.json { render :json => { 
            :project_data => projectsAPI 
            } 
        } 

Le problème est quand je vérifie les résultats de l'API, il retourne simplement tous les champs du projet, sans aucune des choses dans la .select déclaration.

Lorsque je consulte le journal, la requête contient les champs personnalisés, mais contient également le reste des champs des projets.

Comment puis-je personnaliser les champs dans le retour API json des objets cancancan?

Répondre

1

A quoi ressemble le .to_sql?

Avez-vous essayé quelque chose comme ça avec une sous-requête? C'est ainsi que je résous souvent les problèmes de CanCan en ce qui concerne les jointures.

projectsAPI = Project.where("projects.id IN (?)", Project.accessible_by(current_ability).select(:id).to_sql).select('projects.name, projects.price * 5 as new_price') 
+0

Génère une erreur car il sélectionne toujours tous les champs de la sous-requête. Si log the 'Project.accessible_by (current_ability) .select (: id) .to_sql' il rend' SELECT "projets". "Id", "projets". "Id" AS t0_r0, "projets". "Nom" '. .. Donc, fondamentalement le '.select (: id)' sélectionne le 'id' et puis tous les champs dans l'objet de toute façon – HoosierCoder

+0

J'ai été en mesure d'obtenir votre suggestion pour travailler avec .pluck (: id) dans la sous-requête. Cependant, une sous-requête est moins efficace que de simplement sélectionner les bonnes colonnes. Existe-t-il un autre moyen en dehors de '.select' pour obtenir des champs personnalisés en dehors de l'enregistrement actif? – HoosierCoder

+0

Je ne ferais pas un pluck, car cela va d'abord extraire tous les ID dans une requête séparée, et cela peut échouer si beaucoup d'ID sont retournés. La raison pour laquelle CanCan sélectionne plus de champs, c'est qu'elle utilise '.includes (...). References (...)' au lieu de '.left_joins (...)'. Il ne peut pas faire '.left_joins (...)' car le cache des jointures n'est pas partagé avec includes. Je crois qu'il y a des problèmes dans CanCanCan et Rails à propos des deux choses. Je mettrai à jour mon commentaire une fois que je les trouverai. – kaspernj