新手问题 为什么会出现死循环

xiaobai2 · December 26, 2016 · Last by realwol replied at December 26, 2016 · 2287 hits

自定义了一个 json_options 如下,想返回一个树形菜单,没想到当一会再调用 children,求解

scope :children_categories, ->(parent_id) {where("parent_id = ?", parent_id)}

def temp_type_name
    Cms::Category::TEMPLATE_TYPE[self.template_type]
  end

  def children
    Cms::Category.children_categories(self.parent_id)
  end

  self.json_options = {
    only: [:id, :name, :url, :is_page, :level, :position],
    methods: [:temp_type_name, :children]
  }

我最终想要实现的格式如下:

[{
      "id": 13,
      "name": "关于我们",
      "url": "/about_us",
      "position": "",
      "is_page": 0,
       "temp_type_name": "全页面",
      "children": [{...}, {.....}]

    },
    {
      "id": 12,
      "name": "关于我们",
      "url": "/cms/categories/12",
      "position": "",
      "is_page": 0,
      "temp_type_name": "全页面",
      "children": [{...}, {.....}]
   }

循环的 log 如下:

.......
  CACHE (0.0ms)  SELECT `cms_categories`.* FROM `cms_categories` WHERE (parent_id = 13)
  CACHE (0.0ms)  SELECT `cms_categories`.* FROM `cms_categories` WHERE (parent_id = 13)
  CACHE (0.0ms)  SELECT `cms_categories`.* FROM `cms_categories` WHERE (parent_id = 13)
  CACHE (0.0ms)  SELECT `cms_categories`.* FROM `cms_categories` WHERE (parent_id = 13)
  CACHE (0.0ms)  SELECT `cms_categories`.* FROM `cms_categories` WHERE (parent_id = 13)
  CACHE (0.0ms)  SELECT `cms_categories`.* FROM `cms_categories` WHERE (parent_id = 13)
  CACHE (0.0ms)  SELECT `cms_categories`.* FROM `cms_categories` WHERE (parent_id = 13)
  CACHE (0.0ms)  SELECT `cms_categories`.* FROM `cms_categories` WHERE (parent_id = 13)
  CACHE (0.0ms)  SELECT `cms_categories`.* FROM `cms_categories` WHERE (parent_id = 13)
  CACHE (0.0ms)  SELECT `cms_categories`.* FROM `cms_categories` WHERE (parent_id = 13)  
......

是不是你 13 这条记录的 parent 指向了自己

尝试用一下自连接来解决这类问题吧 http://guides.ruby-china.org/association_basics.html#%E8%87%AA%E8%BF%9E%E6%8E%A5

#2 楼 @IChou 好吧,我想起了之前遇到的问题

5 Floor has deleted

很好奇,为什么最近看到很多帖子 都直接回 at 几位老板

You need to Sign in before reply, if you don't have an account, please Sign up first.