2011-07-26 2 views
2

레일 2 앱을 업데이트 중입니다. 우리는 아주 좋은 '또는'범위를 제공하는 fake_arel을 행복하게 사용해 왔습니다.rails 3 - 'or'scope

이제 레일 3을 사용하여이 방법을 찾을 수 없습니다.

우리는 다음과 같은 코드가 있습니다

scope.or(Event.horse, Event.dog, Event.trap).today 

모델은 다음과 같습니다

class Event < ActiveRecord::Base 
named_scope :horse, lambda { {:conditions => ["sport_category_id in (?)", SportCategory.find_horse_ids] }} 
named_scope :dog, lambda { {:conditions => ["sport_category_id in (?)", SportCategory.find_dog_ids] }} 
named_scope :trap, lambda { {:conditions => ["sport_category_id in (?)", SportCategory.find_trap_ids] }} 
end 

이 범위가 분리 될 필요가 있고 사방에 사용됩니다. 이 모델에는 실제로 조합으로 사용되는 수십 개의 스코프가 있으므로 모든 것을 다시 작성하는 것이 우리가 수행하고자하는 마지막 작업입니다.

당신이 '또는'함께 사용할 수 없다는 것이 이상하게 보입니다.

누군가 레일 3에서이 작업을 멋지게 처리 할 수있는 방법을 제안 할 수 있습니까? 아슬레를 사용한다고해도 나는 어떻게 보이지 않습니다. 우리는 다른 프로젝트에서 meta_where를 사용하고 있지만 그런 것도 제공하지 않습니다.

답변

1

음, 그렇게 할 수있는 방법이며, 모델에 (당신의 필요에 적응!) :

where(:event => ['horse', 'dog', 'trap']) 

배열 당신이 원하는되는 A의 문을 생성합니다.

scope :my_scope, where(:event => ['horse', 'dog', 'trap']) 

그런 다음 당신이 이런 식으로 사용할 수 있습니다 : 또한, 당신은 것을 달성하기 위해 레일 3 개 범위를 사용할 수 있습니다

mymodel.my_scope # and possibility to chain, like : 
mymodel.my_scope.where(:public => true) 
+0

어쩌면이 부분을 어디에 넣어야할지 모르겠다. scope : find_scope, where (: event => [ 'horse', 'dog', 'trap'])) : ActiveRecord :: StatementInvalid : 이벤트라는 이름의 속성이 없습니다. ''events' 테이블에 존재합니다. – phil

+0

그래서 제가 쓴 이유는 다음과 같습니다. 여기에 모델을 게시하면 이해할 수 있도록 도와 드리겠습니다. –

+0

모델을 업데이트했습니다. 나는 당신이하는 일이 어떻게해서든지 기존의 범위를 호출하는 것을 볼 수 없다. 그것은 전체적인 문제이다. – phil

0

내가 fake_arel에서 '또는'기능을 찢어를하고 레일 작업 있어요

I 케이스 누군가가 나에 넣어 한 관심이 3.0 (우리가 여기에 사용하지 않는대로 3.1 작동하는지 확실하지 않음) gist : 내가 얻을 수 없습니다

0

Phil이 Github-gist의 코드를 작성했지만 필자는 더 단순한 해결책이라고 생각하는 다음과 같은 것을 생각하게되었습니다. 그럼에도 불구하고 ActiveRecord :: Relation 클래스를 반환하는 클래스 메서드를 사용합니다.

def self.or alt_scope 
    either = scoped.where_clauses.join(' AND ') 
    alternative = alt_scope.where_clauses.join(' AND ') 

    Locatie.unscoped.where("(#{either}) OR (#{alternative})"). 
    joins(scoped.joins_values).joins(alt_scope.joins_values). 
    group(scoped.group_values).group(alt_scope.group_values). 
    having(scoped.having_values).having(alt_scope.having_values). 
    includes(scoped.includes_values).includes(alt_scope.includes_values). 
    order(scoped.order_values).order(alt_scope.order_values). 
    select(scoped.select_values).select(alt_scope.select_values) 
end 

그냥 수업에 추가하십시오. 다음과 같이 그런 다음 여러 OR 쿼리를 만들 수있는 능력을 얻을 것이다 :

Event.horse.or(Event.dog).or(Event.trap) 

을 어느 당신이 할 수있는 범위에서 결과적으로 '저장'

scope :horse_dog_or_trap, horse.or(Event.dog).or(Event.trap) 

도 더욱 범위를 확장, 등 다음과 같이 :

Event.horse.or(Event.dog).or(Event.trap).today