2011-04-08 2 views
31

레일에서 Arel을 사용하여 - 을 효과적으로 생성하는 방법을 찾고 있는데, 여전히 SELECT * FROM table으로 처리 할 수 ​​있습니다.Rails/Arel : 모든 레코드를 ActiveRecord :: Relation으로 선택

예를 들어, 여러 개의 범주로 헤어 졌 잖아 모델을 가지고 있고, 나는 다음과 같은 방식으로 이들에 대한 카운트를 돌려 : 이것은 잘 작동하고 COUNT 쿼리를 발사있는 장점이있다

relation = Model.where(:archived => false) # all non-archived records 
record_counts = { 
    :total => relation.count, 
    :for_sale => relation.where(:for_sale => true).count 
    :on_auction => relation.where(:on_auction => true).count 
} 

실제로 레코드 자체를 선택하기보다는 MySQL을 사용합니다.

그러나 이제는 보관 된 레코드를 카운트에 포함해야하지만 relation = Model.all의 결과는 Array이며, 나는 ActiveRecord::Relation을 찾고 있습니다.

내가 이것을 할 수있는 유일한 방법은 model.where(model.arel_table[:id].not_eq(nil))인데, 다소 효과가 있지만 다소 불합리한 것 같습니다.

누구든지이 문제에 관해 밝힐 수 있습니까?

답변

11

: 레일 3.x를 들어 Model.where(nil)

: 레일 4.0 (이전에하지 않았다)의 관계

반환 Model.allModel.scoped

+0

Rails 4.0.13에서'Model.all'은 릴레이션을 반환하고'Model.scoped'는 더 이상 사용되지 않습니다. – Tsutomu

48

시도 relation = Model.scoped. 그러면 실제 결과가 아닌 관계가 생깁니다.

+0

완벽한을, 감사합니다 ! 10 분 안에 받아 들일 수 있습니다. – Jeriko

+0

'Model.scoped'는 Rails 4.X에서 더 이상 사용되지 않습니다. 다른 답변을 참조하십시오. –

+1

다시 한번 감사 드리겠습니다. 카일의 대답은 다른 레일즈 버전에 대한보다 완벽한 그림을 제공하기 때문에 받아 들였습니다. – Jeriko

1

당신이 원하는 것 : 당신이 관계가 무엇인지 볼 경우, 그것은 사실 ActiveRecord::Relation

relation = Model.scoped 

합니다.

는이 페이지에서 볼 수 있듯이 :

http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html#method-i-scoped

은 말한다 다음 중간 통과하는 경우 절차 적으로 복잡한 쿼리를 생성 할 때

익명의 범위가 을 유용하는 경향이 값 (스코프)가 일급 인 개체로 편리합니다. 레일 4.1에 대한 이상

+0

'scoped '가 실제로 필요한 유일한 시간은'Model.all'과 같은 모든 레코드에 대해 작업하고 싶을 때뿐입니다. 'Model.where (: archived => false)'를 수행하는 것만으로 이미'ActiveRecord :: Relation' 객체를 반환 할 것입니다. –