2012-08-23 2 views
0

RoR과 조금만 협력 해왔고 쿼리 결과를 필터링하는 방법을 찾았지만 제대로하고 있는지 확신 할 수 없습니다. 어떤 새로운 언어/기술에서와 마찬가지로, 당신은 어릴 때의 대본이되고 나는 그것을 좋아하지 않습니다. 나는 종류의 코드를 생각RoR 앱에서 쿼리 결과를 필터링하는 방법은 무엇입니까?

scope :which_user, lambda {|user_id| {:conditions => ["user_id = ?", user_id]}} 

:

나는 주어진 사용자 ID 만 약속을 유지하는이 코드가 약속 모델에서,이

@events = Appointment.scoped 
@events = @events.which_user(current_user.id) 

을하는 컨트롤러가 예를 들어, 나는 그것을 간신히 이해할 수 있습니다. 누가 루비 마술이이 사건에서 어떻게 작동하는지 조금 더 말해 줄 수 있습니까?

답변

2

음, 확인하기 위해 무대 뒤에서 계속 마법의 모든 종류가 가장 루비 레일에 물건, 그것은 작동하지만 기본적으로 :

@events = Appointment.scoped 

는 SQL 쿼리의 표현을 생성하지만, '아무튼 그것을 실행하지 마십시오. 이렇게하면 쿼리를 실행하기 전에 쿼리를 수정할 수 있습니다. 기본 쿼리는 테이블의 모든 행에 대한 모든 필드를 선택하는 것입니다.

scope :which_user, lambda {|user_id| {:conditions => ["user_id = ?", user_id]}} 

조건 (또는 순서, 또는 무엇이든) SQL 쿼리를 추가하는 방법을 정의합니다. 따라서 somequery.which_user(3)을 호출하면 somequery의 모든 제한과 user_id3과 같아야한다는 추가 제한이있는 다른 쿼리가 반환됩니다.

@events = @events.which_user(current_user.id) 

위에서 언급 한 것뿐입니다. 이제 @events은 올바른 user_id이있는 행의 모든 ​​필드를 반환하는 쿼리입니다.

그리고 Rails 마법의 마지막 비트는 이러한 쿼리가 자동으로 실행되고이를 사용할 때 레코드 배열로 변환된다는 것입니다. 이 함수는 each과 같은 함수입니다. 레코드를 반복하고 싶다면 실제 레코드를 반복해야하므로 Rails가 쿼리를 실행하여 사용자에게 전달합니다.

희망 하시겠습니까? 내가 너무 애매한 것을 남겨 두었다면 알려줘.

PS : 매우 유사한 방식으로 작동하는 기본 레일스 방법 where도 있습니다. 이와 같은 간단한 조건의 경우 scope을 사용하는 것보다 쉽습니다.

@events = Appointment.where(:user_id => current_user.id) 
관련 문제