2009-05-22 2 views
2

Google은 일반적인 소셜 콘텐츠 (블로그/포럼/스트림 등)를 제공하는 웹 앱을 보유하고 있습니다.레일 디자인/코딩

모든 콘텐츠는 도시로 표시 될 수도 있습니다. 나는. 블로그 게시물이 뉴욕에만 해당되는 경우 블로그 게시물은 뉴욕으로 표시됩니다.

사용자가 도시보기 환경 설정을 지정하고 모든 것을 다른 사람에게 보여 주면 모든 사이트의 도시 정보 만 표시 할 수 있습니다.

그래서 city_specifc_view에 'city and city == current_city'를 추가해야합니까? (특히이 논리가 변할 위험이 있기 때문에) 유지 보수가되는 모든 모델 클래스의 모든 파인더에 적용됩니다.

이 논리를 적용하는 올바른 방법이 무엇인지 궁금합니다. 모델 전체에 if/else 대신 중앙 위치 (기본 찾기를 오버 라이딩하는 것처럼)를 수행 할 수 있습니까? 원숭이가 ActiveRecord에 패치를 취하고 있습니까?

답변

2

ActiveRecord :: Base에는 범위라는 기능이 있습니다. 특정 범위에서 발행되는 쿼리는이 범위의 발견 - 옵션과 결합됩니다 즉 :

class Person < ActiveRecord::Base 
    default_scope :order => 'last_name, first_name' 
    end 

어쩌면 이것은 당신이 보길 원하는 기능? 수정 AR.find는 당신을위한 최선의 선택 인 경우

1

는 모르지만 그것은 나를 위해 일한 :

class Content < AR::base 
    def self.find(*args) 
    if logged_user.preferred_city 
     choose_city(super(*args)) 
    else 
     super(*args) 
    end 
    end 
protected #to be inherited by content subtypes (post, pic, stream...) 
    def self.choose_city(target) 
    case target 
     when Array target.select{|t| choose_city(t)} 
     when Person (target.city == logged_user.preferred_city ? target : nil) 
     else target 
    end 
    end 
end 

희망이 당신에게

+0

감사 페르 도움이 될 수 있습니다. 당신은 해결책이 좋습니다. 필터에 쿼리를 추가하여 DB로부터 필터링 된 데이터를 가져 오는 것을 피할 수 있다면 생각하고있었습니다. 나는 with_scope를 사용하여 AR에 패치를 적용하여 파인더를 관리했습니다. 하지만 아직까지는 연관성을 위해 생성 된 쿼리를 처리해야합니다. –

+0

나는 연관성이있는 관련 쿼리를 포함하지 않지만 함정이있다. DB가 로컬 인 경우 더 작은 (인덱싱 된) 쿼리가 하나의 큰 쿼리 (조인이 필요한 경우)보다 좋을 수도 있고, 원격 인 경우 네트워크 연결이 적을 수도 있습니다. 너의 DB가 더 좋다. 희망은 당신을 돕는 것이지만 항상 그렇듯이 : 선택하기 전에 솔루션을 벤치마킹하십시오! – Oinak