2017-09-30 4 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"AS t0_r0, "프로젝트", "이름"'이 렌더링됩니다. .. 기본적으로'.select (: id)'는 객체의 id를 선택한 다음 객체의 모든 필드를 선택합니다. – HoosierCoder

+0

하위 쿼리에서 .pluck (: id)을 사용하여 작업하도록 제안을 얻을 수있었습니다. 그러나 하위 쿼리는 오른쪽 열을 선택할 수있는 것보다 효율적이지 않습니다. 활성 레코드에서 사용자 정의 필드를 가져 오는'.select' 외에 다른 방법이 있습니까? – HoosierCoder

+0

나는 뽑기를하지 않을 것입니다. 왜냐하면 먼저 분리 된 모든 ID를 추출 할 것이고, 많은 ID가 반환되면 실패 할 수 있기 때문입니다. CanCan이 더 많은 필드를 선택하는 이유는'.left_joins (...) '대신'.includes (...). references (...)'를 사용한다는 것입니다. 조인 캐시가 include와 공유되지 않으므로 .left_joins (...)를 수행 할 수 없습니다. 저는 CanCanCan과 Rails에 두 가지 문제가 있다고 생각합니다. 내가 찾으면 내 의견을 업데이트 할 것입니다. – kaspernj