2011-09-27 60 views
0

我在我的模型之一使用回形針:回形針和JSON,「堆棧級別太深」

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

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

    scope :event_type, lambda { |eventType| 
     self.scoped.where('event_type_id IN (?)', eventType) unless eventType.blank? 
    } 

    scope :in_date, lambda { |date| 
     self.scoped.where('(MONTH(`date_start`) BETWEEN ? AND ?) OR (MONTH(`date_end`) BETWEEN ? AND ?)', date[0],date[1],date[0],date[1]) unless date.blank? 
    } 

    has_attached_file :map, :styles => { :medium => "238x238>", 
            :thumb => "100x100>" 
           } 
end 

我做出這個動作的Ajax請求:

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

respond_with(@events) 
end 

我把這個網址得到json的答案。當我做了,我得到的錯誤:「堆棧層面太深」

任何人都可以幫助我嗎?

我的蹤跡是在這裏:

http://paste.bradleygill.com/index.php?paste_id=316663

回答

1

Stack depth too deep表明您無限循環結束了。你的大陸範圍是問題,因爲你的方法和參數具有相同的名稱,當你在大陸範圍內調用參數時,最終會出現無限循環。

另外,爲什麼不把範圍寫成一系列的類方法呢?我不是使用lambdas傳遞參數的巨大粉絲,因爲它使讀起來有點難。以下是將示波器作爲類方法的示例

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

    class << self 
    def continent(cont) 
     where('continent_id IN (?)', cont) unless cont.blank? 
    end 

    def event_type(eventType) 
     where('event_type_id IN (?)', event_type_id) unless event_type_id.blank? 
    end 

    def in_date(date) 
     where('(MONTH(`date_start`) BETWEEN ? AND ?) OR (MONTH(`date_end`) BETWEEN ? AND ?)', date[0],date[1],date[0],date[1]) unless date.blank? 
    end 
    end 

    has_attached_file :map, :styles => { :medium => "238x238>", 
           :thumb => "100x100>" 
          } 
end 
+0

感謝您的回答,但是如何在控制器上使用該功能?這與lambda表達式一樣嗎? – Sebastien

+0

@Sebastien:您可以像訪問命名範圍一樣訪問類方法,因此可以使用'Event.continent'。如果你想使用你的原始代碼,只需重命名你傳遞給'continent'範圍的參數 –

+0

我仍然有我的錯誤,它來自has_attached_file:map,:styles => {:medium =>「238x238>」,: thumb =>「100x100>」} – Sebastien