3

私はRailsの初心者ですが、スコープに問題があります。

私は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つのスコープを同時に使用したいと思います。やった :

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

しかし、私は動作しません、私はこのエラーがあります:

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

これは、最初のスコープが配列を返すためです。

それを機能させるにはどうすればよいですか?

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

4

2 に答える 2

3

スコープに「.all」を追加しないでください。

SQLクエリをトリガーすることにより、連鎖可能なActiveRelationを配列に変換します。

だから、単にそれを削除します。

ボーナス:

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

scope :continent, lambda { |continent|   
  self.scoped.where('continent_id IN ( ? )', continent) unless continent.blank?
}
于 2011-08-10T08:01:52.380 に答える
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

上記のコードでは、すでにすべてが「スコープ」として返されています。さらに、パラメータが空白でない場合にのみ呼び出されるため、スコープに「unless」は必要ありません。したがって、スコープは次のようになる可能性があります

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

または、より多くのRails 3ウェイでは、

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

これははるかに短いです:)

于 2011-12-16T13:56:20.750 に答える