2014-12-28 5 views
0

좋아에서 데이터베이스 쿼리, 나는 내가 그렇게 PHP에서가 아니라 레일에 루비에서 할 방법을 알고 다음을 수행하려고 시도하고있다 열려 있거나 보류중인 상태에 대한 테이블을 호출합니다.루비 배열

저는 레일에서 이것을하고 싶습니다. 현재 내가 내 컨트롤러이있어 :

class CallsController < ApplicationController 
    def index 
    @calls = Call.all 
    end 
end 

을 그리고 이것은 내 생각이다 :이 시도

<table> 
    <% @cals.each do |call| %> 
    <tr> 
     <th><%= link_to call.id, call_path(call) %></th> 
     <th><%= call.cname %></th> 
     <th><%= call.cbn %></th> 
     <th><%= call.email %></th> 
     <th><%= call.operator %></th> 
     <th><%= call.reason %></th> 
     <th><%= call.ticket %></th> 
     <th><%= call.created_at %></th> 
     <th><%= call.tier %></th> 
     <th><%= call.status %></th> 
     <th><%= link_to 'Edit', edit_call_path(call) %></th> 
     <th><%= link_to 'Remove', call_path(call), method: :delete, data: { confirm: 'Are you sure?' } %></th> 
    </tr> 
    <% end %> 
</table> 
+0

보기에 오타가 있음에 유의하십시오. 거기에'@ cals' 인스턴스 변수를 사용하고 있습니다 만, 컨트롤러에서는'@ calls'로 할당되어 있습니다. – fivedigit

+0

죄송합니다. 전체 def 인덱스는 실제로입니다. '클래스 CallsController <와 ApplicationController' '데프 지수' '@calls = Call.all' '@cals = Call.all' 끝 나는 열거 나 내가 가진 이후 출원을 정의하고자하고 CAL을 두 개의 쿼리는 동일한 페이지 하나에 대해 열거 나 보류 중 하나를 나열한 다음 다른 테이블 모두를 나열합니다.
Chris

답변

2

:

def index 
    @calls = Call.where(status: ['open', 'pending']) 
end 

그것은 확실히이 where 통화를하는 것이 좋습니다 간주 귀하의 컨트롤러에 누출되지 마십시오. 그들은 많은 내부를 Call으로 노출하고 있습니다. 당신은 Call 클래스 내부의 범위를 정의 할 수 있습니다 :

class Call < ActiveRecord::Base 
    scope :open_or_pending, -> { where(status: ['open', 'pending']) } 
end 

그리고 사용하는 컨트롤러 내부 : 지금, 컨트롤러가 Callstatus 필드가 있음을 알 필요가 없다

def index 
    @calls = Call.open_or_pending 
end 

주 , 그리고 그것의 가치가 될 수있는 것.

+0

+1 왜 컨트롤러에서'where' 절 대신 스코프를 사용하는 것이 좋습니까? 둘 다 유출되지 않을까? 어쨌든 범위는 동일한 SQL로 변환됩니다. –

+0

범위는 캡슐화 및 재사용을 제공합니다. 캡슐화는 기본 데이터베이스가 변경 될 때 유용합니다. 범위를 사용하면 응용 프로그램의 나머지 부분 만 범위를 변경하면됩니다. 복잡한'where' 체인이 있다면, 이것은 하나의 스코프로 옮겨 질 수 있고 작은 스코프로 분해 될 수 있습니다. 컨트롤러는 최상위 범위를 호출하고 복잡성에 신경 쓰지 않아도됩니다. 범위는 또한'where' 호출을 계속 반복하지 않아도되는 것을 방지합니다. 체인이 다른 장소에 붙여 넣기되는 '위치'체인은 매우 일반적입니다. 이 경우 스코프가 반드시 필요합니다. – fivedigit

+0

코드를 건조하게 유지하기 위해 스코프를 좋아하고 감사합니다. 내가 이해하지 못했던 부분은 보안 문제입니다. 링크를 공유하거나 더 설명해 주시겠습니까? –