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オブジェクトが返されるフィールドをカスタマイズするにはどうすればよいですか?
まだサブクエリ内のすべてのフィールドを選択しているため、エラーが表示されます。 'Project.accessible_by(current_ability).select(:id).to_sql'をログすると、' SELECT "プロジェクトをレンダリングします。" id "、" projects "。" id "AS t0_r0、" projects "、" name "'。 ..基本的に '.select(:id)'は 'id'を選択してオブジェクトのすべてのフィールドを選択します。 – HoosierCoder
サブクエリで.pluck(:id)を使用するようにあなたの提案を得ることができました。ただし、サブクエリは、右の列を選択するだけでは効率的ではありません。アクティブなレコードからカスタムフィールドを取得する '.select'以外の方法はありますか? – HoosierCoder
これは、最初に別のクエリですべてのIDを抽出し、多くのIDが返された場合に失敗する可能性があるため、抜け落ちはしません。 CanCanがより多くのフィールドを選択する理由は、 '.left_joins(...)'の代わりに '.includes(...)。references(...)'を使用するからです。結合キャッシュがインクルードと共有されないため、 '.left_joins(...)'を実行することはできません。 私は両方のことについてCanCanCanとRailsに問題があると思います。私は一度それを見つけると私のコメントを更新します。 – kaspernj