2017-09-30 3 views
0

私はcancancanオブジェクトのフィールドをカスタマイズしようとしています:中のもののいずれかなしに、Cancancan選択フィールド

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

私はAPIの結果を確認するときに問題があるが、それだけですべてのプロジェクトのフィールドを返します。 .select声明。

ログを確認すると、クエリにカスタムフィールドが含まれますが、残りのフィールドもプロジェクトから取得されます。

json APIでcancancanオブジェクトが返されるフィールドをカスタマイズするにはどうすればよいですか?

答えて

1

.to_sqlの外観はどのようになりますか?

サブクエリでこれを試しましたか?それが、私がCanCanの問題を解決する方法です。

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

まだサブクエリ内のすべてのフィールドを選択しているため、エラーが表示されます。 'Project.accessible_by(current_ability).select(:id).to_sql'をログすると、' SELECT "プロジェクトをレンダリングします。" id "、" projects "。" id "AS t0_r0、" projects "、" name "'。 ..基本的に '.select(:id)'は 'id'を選択してオブジェクトのすべてのフィールドを選択します。 – HoosierCoder

+0

サブクエリで.pluck(:id)を使用するようにあなたの提案を得ることができました。ただし、サブクエリは、右の列を選択するだけでは効率的ではありません。アクティブなレコードからカスタムフィールドを取得する '.select'以外の方法はありますか? – HoosierCoder

+0

これは、最初に別のクエリですべてのIDを抽出し、多くのIDが返された場合に失敗する可能性があるため、抜け落ちはしません。 CanCanがより多くのフィールドを選択する理由は、 '.left_joins(...)'の代わりに '.includes(...)。references(...)'を使用するからです。結合キャッシュがインクルードと共有されないため、 '.left_joins(...)'を実行することはできません。 私は両方のことについてCanCanCanとRailsに問題があると思います。私は一度それを見つけると私のコメントを更新します。 – kaspernj

関連する問題