2012-10-02 2 views
0

내 Rails 3.2.8 앱에는 일부 상황에서 함께 연결하려는 일부 명명 된 스코프가 있습니다.Rails 3.2 : 람다 범위 연결하기?

따라서, 예를 들어, 나는이 두 가지 범위가 있습니다

scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end } 
scope :in_date_range, lambda { |start_date, end_date| includes([:person, :pier_module]).where("(status_date >= ?) AND (status_date <= ?)", start_date, end_date) } 

내가 개별적으로 사용하지만, 나는이 같은 둘을 호출 할 수 싶습니다

WorkRequest.by_status("Accepted").in_date_range("2012-01-01", "2012-10-02") 

을 그것을 시도하면 in_date_range가 Array의 메소드가 아니라고 불평합니다.

하지만 또 다른 범위가,

scope :active, includes([:person, :pier_module]).where("status = 'New Request'") 

내가

WorkRequest.active.in_date_range("2012-01-01", "2012-10-02") 
작동

할 경우! 명백하게 활성 범위는 관계를 반환하지만 람다 범위는 배열을 반환하므로 쇠사슬을 연결할 수 없습니다.

간단한 스코프와 람다 스코프의 차이, 매개 변수의 영향 및 내가 수행 한 결합 된 스코프를 작성하는 데 도움이 될 수있는 것이 있는지를 알고 싶습니다.

scope :by_status_in_date_range, lambda { |status, start_date, end_date| includes([:person, :pier_module]).where("(status = ?) AND (status_date >= ?) AND (status_date <= ?)", status, start_date, end_date) } 

작동하지만 DRY (개별 범위가 필요하므로) 또는 Rails-ish는 작동하지 않습니다. 여기와 다른 곳에서 나는 비슷한 질문을 보았지만이 상황에 적용되는 것 같지 않은데, 나는 두 개의 람다를 매개 변수로 연결하려고합니다. 때문에 귀하의 범위

scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end } 

metods allfind_all_by_status 반환 Array 대신 ActiveRecord::Relation의 발생

+1

'WorkRequest.in_date_range ("2012-01-01", "2012-10-02"). by_status ("Accepted")'작업이 궁금합니다. – Gazler

+0

나는 그렇다! 나는 그것을 시험하기에 너무 "터널을 보았다". 나는 그것이 람다 때문인 것으로 확신했지만 분명히 그렇지 않았습니다. 이것은 훌륭합니다. 그런 식으로 호출 할 수는 있지만 in_date_range가 Relation을 반환하는 이유와 Array에 by_status가 왜 궁금합니다. Curiouser 및 curiouser. –

답변

5

. 예를 들어 where으로 바꿔야합니다.

scope :by_status, lambda { |status| where(:status => status) unless status == "All" } 
+0

감사합니다, ck3g, 그 말이 맞는! 나는 그것이 관계를 반환하기 위해 그것을 바꿀 수 있는지 알게 될 것이다. –

+0

체인의 유효 범위입니다. – ck3g