1

나는이 내 레일 응용 프로그램에서 다음과 같은 명명 된 범위 ". 곧 빗질"Rails 3에서 다른 스코프를 결합하는 방법은 무엇입니까?

scope :published, :conditions => {:status => 'published'} 
    scope :coming_soon, :conditions => {:status => 'coming_soon'} 
    scope :in_development, :conditions => {:status => 'in_development'} 
    scope :cancelled, :conditions => {:status => 'cancelld'} 

나는 문제가 "게시"및 콤바인을 쓰는 데 여기 내가 시도한 것이있다.

scope :public, :conditions => {"status == published || status == coming_soon"} 

아이디어가 있으십니까?

+0

AND 또는 OR을 원하십니까? IIRC'||'는 OR입니다. – ScottJShea

+0

나는 그것에 대해서도 혼란스러워했다. 질문은 결합 ('AND'와 같지만 코드에는 'OR'이 있습니다.) 그들은 한 필드를보고있는 것으로 나타났습니다. 필드는 동시에 두 가지 다른 값일 수는 없습니다. 'x = "a"AND x = "b"'!) 그래서'OR'이어야합니다 :'x = "a"OR x = "b"' –

+0

그래, 내 생각이었다. - 그것은 OR이되어야합니다. 그러나 어떤 방법 으로든, 아래의 코드는 작동하는 것처럼 보입니다. – Slick23

답변

3

레일 2 : named_scope :public, :status => ['published', 'coming_soon']
레일 3 scope :public, where(:status => ['published', 'coming_soon'])

레일 배열을 참조하고 SQL에서 IN 연산자를 사용한다.

참고 사항 : Article.published.coming_soon의 다른 접근법 (체인 기존 범위)은 해당 시점에 해당 항목이 될 수 없거나 서로의 하위 집합이 될 수 없기 때문에 작동하지 않습니다.

다른 참고 사항 : 가변 매개 변수에 의존하는 것을 원할 때 조심하십시오. 그러나 문제가있다 scope :upcoming_appts, where(['appt_dt > ?', Time.now])

: named_scope :upcoming_appts, :conditions => (['appt_dt > ?', Time.now])
레일 3 : 예를 들어

레일 2 [이 무효입니다, 당신이
을 작성할 수 있습니다 당신이 예약 시스템은 "미래의 약속을"원 말하는 Time.now그 자체가 인 경우이 아닌이 평가 될 때 이 평가됩니다.
당신이 람다 사용이 극복 (바보 이름을하지만, 기본적으로 의미 익명 함수를 - 심지어 간단한 '실제로 이름이없는 기능'을 넣어)하기 위해 다음과 같이

을 [이 유효입니다 ]

레일 2 : named_scope :upcoming_appts, lambda {:conditions => (['appt_dt > ?', Time.now])}
레일 (3)이 범위가 현재 실행시마다 평가받을 것이다 scope :upcoming_appts, lambda {where(['appt_dt >= ?', Time.now])}

-이 사용된다 - 때문에 Time.now 실제 현재 일시 것이다.

+1

coming_soon 문자열의 끝에 큰 따옴표를 사용했지만 단일 문자로 시작했습니다.하지만 변경해야하지만 적어도 여섯 가지 변경 ... – ScottJShea

+0

쉼표에 오류가 발생합니다. 'SyntaxError : /Users/justin/Code/boxfire/app/models/product.rb:37 : 구문 오류, 예기치 않은', ', 예상 tASSOC .. – Slick23

+0

변경된 내용 :': status => [ 'published', 'coming_soon']'그리고 그것은 작동합니다. 고마워요! : = "{status =?", [ 'published', 'coming_soon']} – Slick23