2011-03-16 2 views
1

나는 본질적으로 레일 3 모델 범위, 만들려고 해요 :이 만들 수있는 방법을 찾을 수 없습니다SQL 또는 범위 3/Arel

scope :published, where(:published => true) 

scope :viewable_by, lambda { |user| where(:user_id => user.id).or(published) } 

의 문제점은,이다 작업.

나는 arel_table 일하는 것이 기대하지만, 그것은 "액티브 :: 관계를 방문 할 수 없다"불평했다 : 이것은 Arel으로 "게시"범위를 복제하여 수행 할 수 있지만 그때는 반복 될 것이다

where(arel_table[:user_id].eq(user.id)).or(published) 

코드 (그리고 내 프로젝트에서 "게시 된"범위는 좀 더 깊이 있음).

내가 가지고 올 수있는 최선은 이것이다 :

scope :published, where(:published => true) 
scope :viewable_by, lambda { |user| where("user_id = ? OR #{published.where_clauses.first}", user.id) } 

(물론에만 작동 :

scope :viewable_by, lambda { |user| where("(user_id = ?) OR (#{published.where_values.collect(&:to_sql).join(" AND ")})", user.id) } 

답변

0

이것은 내가 주위를 파고의 조금 후에 가지고 올 수있는 가장 짧다 단일 where 절을 사용하는 경우 join을 사용하십시오.

MetaWhere과 같은 보석을 사용하면 Arel unde rpinnings. 다음은 OR 쿼리를 만드는 위에 링크 된 기본 페이지의 예입니다.