2011-08-10 15 views
3

私はRailsの初心者です。私は範囲に問題があります。複数の範囲のレール3.0

私は2つのスコープと私のクラスがあります。

class Event < ActiveRecord::Base 
    belongs_to :continent 
    belongs_to :event_type 

    scope :continent, lambda { |continent| 
    return if continent.blank? 
    composed_scope = self.scoped 
    composed_scope = composed_scope.where('continent_id IN (?)', continent).all 
    return composed_scope 
    } 

    scope :event_type, lambda { |eventType| 
    return if eventType.blank? 
    composed_scope = self.scoped 
    composed_scope = composed_scope.where('event_type_id IN (?)', eventType).all 
    return composed_scope 
    } 

エンド

をそして、私のコントローラでは、私は同時に、この2つのスコープを使用します。私がやった:

undefined method `event_type' for #<Array:0x7f11248cca80> 

最初の範囲には、配列を返すためです:

def filter 
    @event = Event.scoped 
    @event = @event.continent(params[:continents]) unless params[:continents].blank? 
    @event = @event.event_type(params[:event_type]) unless params[:event_type].blank? 

    respond_with(@event) 
end 

しかし、私は動作しません、私はこのエラーを持っています。

どうすれば動作させることができますか?

ありがとうございました!

それはアレイにチェーン可能ActiveRelationを変換し、SQLクエリをトリガすることによって:あなたのスコープで「.ALL」を追加してはならない

答えて

3

だから単純に削除してください。

ボーナス:

いくつかのリファクタリング:

scope :continent, lambda { |continent|    
    self.scoped.where('continent_id IN (?)', continent) unless continent.blank? 
} 
+0

どういたしましてはるかに短いこの

scope :continent, lambda { |continent| where('continent_id IN (?)', continent) } 

または、より多くのRailsの3途中のようなもの、

scope :continent, lambda { |continent_id| where(:continent_id => continent_id) } 

になる可能性があります。スコープでスコープが必要なのはなぜですか? – apneadiving

0

私はあなたのスコープ内.scoped必要はないと思います。

def filter 
    @event = Event.scoped 
    @event = @event.continent(params[:continents]) unless params[:continents].blank? 
    @event = @event.event_type(params[:event_type]) unless params[:event_type].blank? 

    respond_with(@event) 
end 

上記のコードでは、すべてが「スコープ」として返されています。 また、あなたのスコープは、あなたのparamsが空でない場合にのみ呼び出されるため、あなたのスコープは 'unless'を必要としません。だからあなたのスコープは:)