Получение бесконечной рекурсии в программе Rails as_json - PullRequest
0 голосов
/ 01 декабря 2011

У меня есть класс Account, который хранит has_many. В классе Store есть подпрограмма, которая возвращает все остальные хранилища для этой учетной записи:

def other_stores
  if account then
    account.stores.find(:all,:conditions=>"id != "+id.to_s)
  else
    []
  end
end

Когда я включаю: other_stores в мою подпрограмму as_json, а затем ссылаюсь на нее, я прикрепляю процессор и зависаю. Я предполагаю, что это бесконечная рекурсия в other_stores. Есть идеи? Есть ли способ остановить рекурсию?

Ruby 1.9.2-p136, Rails 3.0.3

Ответы [ 2 ]

0 голосов
/ 02 декабря 2011

Я думаю, я понял это.Кажется, это работает:

def as_json(options={}) 
  super(:methods => [:blah, :etc, 
                     :other_stores => {:except => :other_stores} ]) 
end 

Крис

0 голосов
/ 01 декабря 2011

Скорее всего, это выглядит так, скажем, у вас есть [@store1, @store2]

@store1.as_json
#as_json calls @store1.other_stores() ==> [@store2]
  @store2.as_json
  #as_json calls @store2.other_stores() ==> [@store1]
    @store1.as_json
    #calls @store1.other_stores() other_stores ==> [@store2]

Самое простое решение - передать идентификаторы, которые уже были обработаны:

def as_json(rendered_ids = [])
...