2017-09-30 3 views
0

Ich versuche, ein Feld auf einem cancancan Objekt anzupassen:Cancancan Feld auswählen

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 
            } 
        } 

Das Problem ist, wenn ich die API-Ergebnisse zu überprüfen, gibt sie nur alle Projektfelder, ohne von dem Zeug in dem .select Aussage.

Wenn ich das Protokoll überprüfen, enthält die Abfrage die benutzerdefinierten Felder, aber auch den Rest der Felder aus Projekten.

Wie kann ich die Felder in der JSON-API-Rückgabe der Cancancan-Objekte anpassen?

Antwort

1

Wie sieht die .to_sql aus?

Haben Sie so etwas mit einer Unterabfrage versucht? So löse ich oft CanCan-Probleme in Bezug auf die Joins.

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

Rendert einen Fehler, da weiterhin alle Felder in der Unterabfrage ausgewählt werden. Wenn 'Project.accessible_by (current_ability) .select (: id) .to_sql' protokolliert wird, werden 'SELECT'-Projekte gerendert." Id "," projects "." Id "AS t0_r0," projects "." Name "'. .. so im Grunde die '.select (: id)' wählt die 'id' und dann alle Felder im Objekt in jedem Fall – HoosierCoder

+0

Ich war in der Lage, Ihren Vorschlag zu bekommen, mit .pluck (: id) in der Unterabfrage zu arbeiten. Eine Unterabfrage ist jedoch weniger effizient, als nur die richtigen Spalten auswählen zu können. Gibt es einen anderen Weg als '.select', um benutzerdefinierte Felder aus dem aktiven Datensatz zu entfernen? – HoosierCoder

+0

Ich würde nicht zupfen, weil das zuerst alle IDs in einer separaten Abfrage extrahiert, und das kann fehlschlagen, wenn viele IDs zurückgegeben werden. Der Grund, warum CanCan mehr Felder auswählt, ist, dass '.includes (...). References (...)' anstelle von '.left_joins (...)' verwendet wird. Es kann '.left_joins (...)' nicht ausführen, da der Joins-Cache nicht mit Includes geteilt wird. Ich glaube, es gibt Probleme in CanCanCan und Rails über beide Dinge. Ich werde meinen Kommentar aktualisieren, sobald ich sie gefunden habe. – kaspernj