Скрепка и JSON, "уровень стека слишком глубоко" - PullRequest
0 голосов
/ 27 сентября 2011

Я использую Скрепку в одной из моих моделей:

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

Я звоню по этому URL, чтобы получить ответ JSON. Когда я это сделал, я получаю сообщение об ошибке: «слишком большой уровень стека»

Кто-нибудь может мне помочь?

Мой след здесь:

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

1 Ответ

1 голос
/ 27 сентября 2011

Stack depth too deep означает, что вы оказались в бесконечном цикле. Ваша континентальная область является проблемой, поскольку ваш метод и аргумент имеют одно и то же имя, когда вы вызываете аргумент в пределах континентальной области, вы в конечном итоге получаете бесконечный цикл.

Кроме того, почему бы просто не написать свои области видимости как серию методов класса? Я не большой поклонник использования лямбда-выражений для передачи аргументов в области видимости, так как это затрудняет чтение. Вот пример использования областей в качестве методов класса

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
...